ALguem usa DAO Genérico com CDI?

Olá!

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.

Ex:

@Named
public abstract class GenericService<T, K> implements IGenericService<T, K>, Serializable {
	
       @Inject
	// @GenericDaoJPA
	private IGenericDAO<T, K> genericDAO;

        // ...

}

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.

Implementação genérica do DAO:

@Named
// @GenericDaoJPA
public class GenericDAO<T, K> implements IGenericDAO<T, K>, Serializable {

	protected Class<T> entityClass;
	
	@Inject
	protected EntityManager entityManager;
	
	@SuppressWarnings("unchecked")
	public GenericDAO(){
		ParameterizedType genericSuperClass = ( ParameterizedType ) getClass().getGenericSuperclass();
                // ClassCastException aqui!
		this.entityClass = (Class<T>) genericSuperClass.getActualTypeArguments()[0];
	}

       // ...
}

Alguém tem alguma solução / sugestão?

Obrigado.

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.

Me corrijam se eu estiver errado. :roll:

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

É, achei aqui http://blog.caelum.com.br/customizando-a-producao-de-dependencias-no-cdi/ um exemplo de Dao genérico da Caelum e vou ver no que dá.

Qualquer novidade eu posto aqui.