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,