1

У меня есть страница с данными, которая считывает данные из класса обслуживания. Этот класс услуг должен быть введен с помощью contactDAO, но он не сразу вводится. Фактически, когда страница сначала загружается, таблица данных пуста, потому что DAO еще не был введен. Однако, если я вызываю addContact(), список «контакты» обновляется отлично, потому что к нему затем вводится contactDAO.Бин Инъекция после DataTable

Как обеспечить, чтобы contactDAO вводился до того, как данные должны использовать класс обслуживания? Я использую Spring 3 и JSF 2.0.

страница с DataTable будет привязать к списку 'contactServiceImpl.contacts':

<h:dataTable var="contact" value="#{contactServiceImpl.contacts}"> 
... 
</h:dataTable> 

Мой ContactServiceImpl выглядит следующим образом:

@Service 
public class ContactServiceImpl implements ContactService { 

    private static List<Contact> contacts = new ArrayList<Contact>(); 

    @Autowired 
    private static ContactDAO contactDAO; 

    private ContactServiceImpl() { 
     contacts = new ArrayList<Contact>(); 

     //TODO: need to inject contactDAO at the same time as instantiation 
     contacts.clear(); 
     try { 
      contacts.addAll(contactDAO.getContacts()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public void addContact(Contact contact) { 
     contacts.add(contact); 
     contactDAO.addContact(contact); 

     contacts.clear(); 
     contacts.addAll(contactDAO.getContacts()); 
    } 

    @Autowired 
    public void setContactDAO(ContactDAO contactDAO) { 
     ContactServiceImpl.contactDAO = contactDAO; 
     System.out.println("DAO is injected"); 
    } 
} 

И applicationContext.xml

<bean id="contactServiceImpl" class="com.example.service.ContactServiceImpl" 
     scope="session"> 
     <property name="contactDAO" ref="contactDAOImpl"/> 
    </bean> 

ответ

1

Spring всегда создавайте bean-компонент перед тем, как вводить свойства с помощью конструктора, поэтому вы не можете использовать вложенный метод прежде чем они будут введены. Для того, чтобы решить эту проблему, вы должны переписать логику или получить ContactDAO в качестве конструктора арг (я знаю, очень некрасиво решение, но работа)

private ContactServiceImpl(ContactDAO costrContactDAO) { 
    contacts = new ArrayList<Contact>(); 

    //TODO: need to inject contactDAO at the same time as instantiation 
    contacts.clear(); 
    try { 
     contacts.addAll(costrContactDAO.getContacts()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 


    <bean id="contactServiceImpl" class="com.example.service.ContactServiceImpl" 
    scope="session"> 
    <constructor-arg ref="contactDAOImpl"/> 
    <property name="contactDAO" ref="contactDAOImpl"/> 
    </bean> 

высокоочищенного рекомендуют искать другое решение (например, я использовать Wicket в моих проектах , есть еще одна концепция рендеринга таблиц - с использованием DataProviders, поэтому у меня нет такой проблемы, возможно, вы можете использовать эту концепцию в своем проекте JSF)

+0

Введена обработка конструктора. Я отправлю, если найду другое решение. Благодарю. – Steve