Problemas com CDI [RESOLVIDO]

Olá Pessoal,

Estou desenvolvendo uma aplicação para aprender os conceitos do CDI e estou tendo um pequeno problema.

Eu tenho uma fábrica de entitymanager que está assim:

public class FabricaDeEntityManager {

	/**
	 * Cria um objeto do tipo {@link EntityManager} a cada requisição.
	 * 
	 * @return Objeto do tipo {@link EntityManager}
	 */
	@Produces @RequestScoped
	public EntityManager criaEntityManager() {
		EntityManagerFactory fabricaEntityManager = Persistence
				.createEntityManagerFactory("sgpa");
		return fabricaEntityManager.createEntityManager();
	}

	/**
	 * Fecha o objeto do tipo {@link EntityManager} que foi criado.
	 * 
	 * @param entityManager
	 */
	public void finaliza(@Disposes EntityManager entityManager) {
		entityManager.close();
	}
}

Tenho um DAO genérico que implementei assim:

class RepositorioGenerico<T> {
	
	/**
	 * 
	 */
	@Inject
	private EntityManager em;
	
	/**
	 * 
	 */
	private Class<T> classeDaEntidade;
	
	/**
	 * 
	 * @param entidade
	 */
	public RepositorioGenerico(Class<T> entidade) {
		this.classeDaEntidade = entidade;
	}
	
	/**
	 * 
	 * @param entidade
	 */
	public void salvar(T entidade) {
		this.em.persist(entidade);
	}
	
	/**
	 * 
	 * @param entidade
	 */
	public void apagar(T entidade) {
		this.em.remove(entidade);
	}
	
	/**
	 * 
	 * @param entidade
	 * @return
	 */
	public T atualizar(T entidade) {
		return this.em.merge(entidade);
	}
	
	/**
	 * 
	 * @param idEntidade
	 * @return
	 */
	public T obterPorId(long idEntidade) {
		return this.em.find(this.classeDaEntidade, idEntidade);
	}
	
	/**
	 * 
	 * @return
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public List<T> obterTodos()	{
		CriteriaQuery cq = this.em.getCriteriaBuilder().createQuery();
		cq.select(cq.from(this.classeDaEntidade));
		return em.createQuery(cq).getResultList();
	}
	
	/**
	 * 
	 * @param consulta
	 * @return
	 */
	public List<T> obterPorRestricao(CriteriaQuery<T> consulta) {
		return this.em.createQuery(consulta).getResultList();
	}
	
	/**
	 * 
	 * @param consulta
	 * @return
	 */
	public T obterUnicoPorRestricao(CriteriaQuery<T> consulta) {
		return this.em.createQuery(consulta).getSingleResult();
	}
}

E tenho uma fábrica para criar o repositório genérico:

public class FabricaDeRepositorioGenerico {

	/**
	 * Cria objetos do tipo {@link RepositorioGenerico} por demanda.
	 * 
	 * @param pontoDeInjecao
	 *            Ponto de injeção usado para saber de qual classe do modelo
	 *            será o repositório.
	 * @return Objeto do tipo {@link RepositorioGenerico}
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	@Produces
	public RepositorioGenerico criaRepositorioGenerico(
			InjectionPoint pontoDeInjecao) {
		ParameterizedType type = (ParameterizedType) pontoDeInjecao.getType();
		Class<?> classe = (Class<?>) type.getActualTypeArguments()[0];
		return new RepositorioGenerico(classe);
	}
}

Estou usando o repositório genérico por composição em um repositório específico que implementa uma interface. Um exemplo:

public interface IRepositorioDeProjeto {

	public void salvar(Projeto projeto);
}
public class RepositorioDeProjeto implements IRepositorioDeProjeto {
	
	@Inject
	private RepositorioGenerico<Projeto> repositorioDeProjetos;
	
	@Override
	public void salvar(Projeto projeto) {
		this.repositorioDeProjetos.salvar(projeto);
	}
}

O problema que estou tendo é que quando eu injeto a interface do repositório (@Inject IRepositorioDeProjeto) ele injeta corretamente o repositório genérico porém não injeta o entity manager que está dentro do repositório genérico. Logo sempre lança um NullPointerException.

Será que alguém consegue me ajudar?

Abs,

Boa Tarde,

essa é facil de resolver

@Produces
 public RepositorioGenerico criaRepositorioGenerico(  
            InjectionPoint pontoDeInjecao) {  
        ParameterizedType type = (ParameterizedType) pontoDeInjecao.getType();  
        Class<?> classe = (Class<?>) type.getActualTypeArguments()[0];  
        return new RepositorioGenerico(classe);  // quando vc da new o cdi não injeta o EntityManager
}  

o que vc pode fazer é adicionar ao seu construtor o EntityManager também

eu fiz um teste assim


public class Factory{
    @inject
    EntityManager em;

    

   @Produces
   public Dao criar(InjectionPoint pontoDeInjecao){

   ParameterizedType type = (ParameterizedType) pontoDeInjecao.getType();  
        Class<?> classe = (Class<?>) type.getActualTypeArguments()[0];  
        return new Dao(em,classe);  // passando o EntityManager e classe
   }
}

Fala Danilo,

Valeu cara, muito obrigado!
Resolveu aqui!