Pregunta

Tengo una página con una datos que lee datos de una clase de servicio. Se supone que esa clase de servicio se inyecta con un ContactDao, pero no se inyecta de inmediato. De hecho, cuando la página se carga por primera vez, la tabla de datos está vacía porque el DAO aún no se ha inyectado. Sin embargo, si llamo a AddContact (), la lista 'Contactos' se actualiza bien porque el ContactDao se inyecta para entonces.

¿Cómo me aseguro de que se inyecte el ContactDao antes de que el DataTable necesite usar la clase de servicio? Estoy usando Spring 3 y JSF 2.0.

La página con el DataTable es BIND a la lista 'contactServiceImpl.contacts':

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

Mi ContactServiceImpl se ve así:

@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");
    }
}

Y ApplicationContext.xml

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

No hay solución correcta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top