Alguém aqui no fórum já utilizou DAO genérico com CDI?
Estou tendo problemas para injetar a implementação correta do DAO no serviço genérico em tempo de execução.
Estou tentando injetar a implementação do DAO genérico com @inject porém, como eu tenho mais de uma implementação do DAO, o servidor não sabe qual implementção injetar.
Tentei criar um Qualifier (@Qualifier) para marcar o Dao Genérico e tentar injetá-lo, beleza, mas o problema é que no DAO genérico eu não tenho o tipo parametrizado da entidade que vai ser manipulada (Persistida, Consultada etc). Aí dá o erro “java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType” na hora de atrinuir o entityClass.
Cara eu também não sei como que é feito a injeção desse dao genérico, mas se vc tem as classes que implementam esse seu dao que é inclusive um abstract, acho que você não deve injeta-lo, mas deve injetar todos os daos especificos…A final você nunca vai instanciar essa classe abstrata.
Aí é que tá…
Eu não quero injetar a implementação abstrata do DAO, e sim uma implementação concreta do DAO que estende a abstrata, só que em tempo de execução dependendo da entidade a ser manipulada.
Na verdade você não deveria era usar o DAO, mas em todo caso:
O seu DAO ficaria assim:
public class DAO<T> implements Serializable {
private final Class<T> classe;
public DAO(Class<T> classe) {
this.classe = classe;
}
}
Primeiro você deve usar um método produtor para gerar o DAO e depois usar um InjectionPoint para o parâmetro.
public class FabricaDao {
@Produces
public DAO criar(InjectionPoint injectionPoint) {
ParameterizedType type = (ParameterizedType) injectionPoint.getType();
Class classe = (Class) type.getActualTypeArguments()[0];
return new DAO(classe);
}
}