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)

Entity Manager não esta sendo instanciado pelo CDI

De alguma forma a injeção do entity manager não está acontecendo no DAO, dando null pointer exception =/

Segue abaixo a classe que produz o entityManager

@Named
@RequestScoped
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();
    }
}

E o DAO

@Named
@RequestScoped
public class DAO<T> implements Serializable{

    private static final long serialVersionUID = -7239289842557606353L;
    private final Class<T> classe;
    @Inject
    private EntityManager em;

    public DAO(Class<T> classe) {
        this.classe = classe;
    }

    public void adiciona(T t) {
        em.getTransaction().begin();
        em.persist(t);
        em.getTransaction().commit();
    }

    public void remove(T t) {
        em.getTransaction().begin();
        em.remove(em.merge(t));
        em.getTransaction().commit();
    }

    public void atualiza(T t) {
        em.getTransaction().begin();
        em.merge(t);
        em.getTransaction().commit();
    }

    public List<T> listaTodos() {
        CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(classe);
        query.select(query.from(classe));
        List<T> lista = em.createQuery(query).getResultList();
        return lista;
    }

    public T buscaPorId(Integer id) {
        T instancia = em.find(classe, id);
        return instancia;
    }

    public int quantidadeDeElementos() {
        long result = (Long) em.createQuery("select count(n) from " + classe.getSimpleName() + " n").getSingleResult();
        return (int) result;
    }

    public int contaTodos() {
        long result = (Long) em.createQuery("select count(n) from Livro n").getSingleResult();
        return (int) result;
    }

O erro é assim que a aplicação é iniciada

Caused by: java.lang.NullPointerException
    at com.black.livraria.dao.DAO.listaTodos(DAO.java:44)
    at com.black.livraria.dao.AutorDAO.listaTodos(AutorDAO.java:47)
    at com.black.livraria.dao.AutorDAO$Proxy$_$$_WeldClientProxy.listaTodos(Unknown Source)
    at com.black.livraria.bean.LivroBean.reset(LivroBean.java:43)
    at com.black.livraria.bean.LivroBean.init(LivroBean.java:36)
4 respostas

Oi Thiago, tudo bem?

Um palpite... tenta tirar o @Named e o @RequestScoped da classe JPAUtil e tenta subir de novo a aplicação?

public class JPAUtil {

    private static EntityManagerFactory emf = Persistence
            .createEntityManagerFactory("livraria");

    // restante do codigo
}

avisa no que deu? abraço

Tentei, infelizmente o entityManager continua dando null pointer exception =/, obrigado pela dica entretanto.

solução

Opa Thiago!

Então não deve ta rolando a injeção da dependência por conta da classe Dao não possuir construtor padrão.

Pelo que vi na aula, o instrutor cria uma classe específica para os DAOs de cada modelo né?

AutorDao, LivroDao, como nesta atividade (da uma olhada na opinião do instrutor):

https://cursos.alura.com.br/course/jsf-cdi/task/15240

Então o LivroDao é que recebe o EntityManager injetado, e ele cria um Dao genérico na mão.

Pode dar uma conferida e avisa aqui? Abraço!

Eu tive que mandar o entityManager pelo construtor do DAO para conseguir fazer isso, realmente você estava certo sobre injeção de dependencia e construtores padrões =o, muito obrigado.