Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

[CDI] Dúvida conceitual - injeção de uma interface

Desculpem as dúvidas bobas, mas gostaria de confirmar meu raciocínio.

No código abaixo, como o CDI sabe instanciar a interface EntityManager?

public class AutorDao implements Serializable{

    @Inject
    EntityManager em;

    private DAO<Autor> dao;

    @PostConstruct
    void init() {
        this.dao = new DAO<Autor>(this.em, Autor.class);
    }

    //outros métodos omitidos
}

É por causa do retorno do método getEntityManager do JPAUtil?

public class JPAUtil {
    private static EntityManagerFactory emf = Persistence
            .createEntityManagerFactory("livraria");

    @Produces
    @RequestScoped
    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }
    public void close(@Disposes EntityManager em) {
        em.close();
    }
}

Outra dúvida seria com relação ao DAO genérico. Esse não está no contexto do CDI, pois ele é instanciado normalmente com new. Isso é por causa do construtor. Não existe um construtor padrão e por isso foi utilizado essa técnica. Porém, a minha dúvida é com relação à se estamos utilizando o CDI, não seria interessante desenvolvermos voltado a ele, ou seja, o ideal é implementarmos tudo com construtor padrão para que o CDI controle todos os objetos da nossa aplicação. Não seria melhor utilizarmos esse DAO genérico de um outro jeito de modo que o CDI o controle?

4 respostas

Rodrigo, tudo bem ?

Ele sabe injetar através desse método sim, contudo o nome do método não é importante e sim o seu retorno, poderia chamar esse método de gerenciadorDoBanco() mas o retorno ainda seria o mesmo, que é o que realmente importa.

Algo que poderia ser feito é criar diversos Daos, onde o CDI gerencie todos, não identifico tanto problema em fazer isso, só muda um pouco a questão de ter um pouco de código repetido.

Matheus,

Muito obrigado pela resposta.

A primeira dúvida era isso mesmo, de acordo com o retorno. Foi o que eu havia imaginado.

A segunda dúvida é com relação ao DAO genérico:

@PostConstruct
    void init() {
        this.dao = new DAO<Autor>(this.em, Autor.class);
    }

O DAO genérico nunca estará no CDI, porém é desnecessário mesmo, visto que já teremos vários DAOs de acordo com cada entidade e esses DAOs já estarão no controle do CDI.

solução

Da forma que está hoje não é possível.

O que eu falo que poderia ser feito é não criar o DAO generico e sim criar Daos especificos, o maior problema disso seria ter que refazer o crud em todos eles, mas dessa forma o CDI poderia injetar todos.

Sim, Matheus. Compreendo. De qualquer forma, do jeito que foi apresentado pelo professor foi a solução elegante.

De qualquer muito obrigado pela ajuda.