1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

NullPointerException Java JPA CDI Tomcat

Boa tarde pessoal. Estou desenvolvendo uma aplicação Java de teste com JPA, CDI e Tomcat. Criei uma classe básica de teste e estou recebendo o seguinte erro.

Erro: Exception in thread "main" java.lang.NullPointerException at br.com.hcancerbarretos.espec.dao.EspecialidadesDAO.getEspecialidades(EspecialidadesDAO.java:16) at br.com.hcancerbarretos.espec.testes.Teste.main(Teste.java:13)

A EspecialidadeDAO está nula, não está sendo injetada corretamente com o @Inject. O mais estranho é que se eu crio uma página JSF e exibo os valores em um dataTable, tudo que tem @Inject é injetado normalmente.

Alguém sabe me dizer como corrigir isso, porque acontece, alguma saída? Seguem abaixo os arquivos e classes.

Classe Modelo

import java.io.Serializable;
import javax.persistence.*;
import java.util.Date;

@Entity
@NamedQuery(name="Especialidade.findAll", query="SELECT e FROM Especialidade e")
public class Especialidade implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="ESPECEALIDADE_ID")
    private long especialidadeId;

    private String descricao;

    @Temporal(TemporalType.DATE)
    @Column(name="DT_ALT")
    private Date dtAlt;

    @Temporal(TemporalType.DATE)
    @Column(name="DT_INCL")
    private Date dtIncl;

    private String sigla;

    @Column(name="USU_ALT")
    private String usuAlt;

    @Column(name="USU_INCL")
    private String usuIncl;

    public Especialidade() {
    }

    //getters and setters ...
}

Classe DAO:

import java.util.List;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import br.com.hcancerbarretos.espec.model.Especialidade;

public class EspecialidadesDAO {

    @Inject
    private EntityManager em;

    public List<Especialidade> getEspecialidades() {
        return em.createNamedQuery("Especialidade.findAll", Especialidade.class).getResultList();
    }

    public String getEspecialidadePorCodigo(long codigo) {
        return em.createQuery("select e.descricao From Especialidade e Where e.especialidadeId = :codigo", String.class)
                .setParameter("codigo", codigo).getSingleResult();

    }

}

EntityManagerProducer:

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Disposes;
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

@ApplicationScoped
public class EntityManagerProducer {

    private EntityManagerFactory factory;

    public EntityManagerProducer() {
        this.factory = Persistence.createEntityManagerFactory("Especialidade");
    }

    @Produces
    @RequestScoped
    public EntityManager createEntityManager() {
        return factory.createEntityManager();
    }

    public void closeEntityManager(@Disposes EntityManager manager) {
        manager.close();
    }

}

Classe teste:

import java.util.List;

import br.com.hcancerbarretos.espec.dao.EspecialidadesDAO;
import br.com.hcancerbarretos.espec.model.Especialidade;

public class Teste {

    public static void main(String[] args) {        
        EspecialidadesDAO dao = new EspecialidadesDAO();
        List<Especialidade> especialidades = dao.getEspecialidades();        
    }
}

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">

    <display-name>Especialidade</display-name>

    <welcome-file-list>
        <welcome-file>index.jsf</welcome-file>
        <welcome-file>index.xhtml</welcome-file>
    </welcome-file-list>

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>

    <listener>
        <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
    </listener>
    <resource-env-ref>
        <resource-env-ref-name>BeanManager</resource-env-ref-name>
        <resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type>
    </resource-env-ref>

</web-app>

META-INF\context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <!-- disables storage of sessions across restarts -->
    <Manager pathname="" />
    <Resource name="BeanManager" auth="Container"
        type="javax.enterprise.inject.spi.BeanManager" factory="org.jboss.weld.resources.ManagerObjectFactory" />
</Context

O arquivo beans.xml está criado, porém vazio, como recomendado.

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java cdi jpa tomcat ou faça a sua própria pergunta.