java.lang.NullPointerException ao efetuar busca no banco de dados Hibernate + JPA [RESOLVIDO]

7 respostas Resolvido
B

Bom dia a todos, estou com um problema de java.lang.NullPointerException ao efetuar uma busca no banco para retornar todos os objetos da minha Entity Endereco. Segue o Erro juntamente com as classes que são indicadas. Se alguém puder me ajudar agradeço muito, já revisei tudo e não consigo identificar qual o problema.

Erro no Console

FATAL:   JSF1073: javax.el.ELException obtido durante o processamento de RENDER_RESPONSE 6: UIComponent-ClientId=, Message=/pages/protected/defaultUser/indexEndereco.xhtml @14,51 value="#{enderecoMB.todosEnderecos}": java.lang.NullPointerException
FATAL:   /pages/protected/defaultUser/indexEndereco.xhtml @14,51 value="#{enderecoMB.todosEnderecos}": java.lang.NullPointerException
javax.el.ELException: /pages/protected/defaultUser/indexEndereco.xhtml @14,51 value="#{enderecoMB.todosEnderecos}": java.lang.NullPointerException

Caused by: javax.el.ELException: java.lang.NullPointerException
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:368)
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    at com.sun.el.parser.AstValue.getValue(AstValue.java:140)
    at com.sun.el.parser.AstValue.getValue(AstValue.java:204)
    at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:226)
    at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    ... 50 more
Caused by: java.lang.NullPointerException
    at br.com.bean.EnderecoMB.listarEnderecos(EnderecoMB.java:94)
    at br.com.bean.EnderecoMB.getTodosEnderecos(EnderecoMB.java:115)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:363)
    ... 57 more

Seguem as classes:

EnderecoDAO.class

public class EnderecoDAO extends GenericDAO<Endereco> {
    
    private static final long serialVersionUID = 1L;
    
    public EnderecoDAO() {
        super(Endereco.class);
    }
}

que estende a classe GenericDAO, onde se encontra o método de busca.

GenericDAO.class

abstract class GenericDAO<T> implements Serializable {
    
    private static final long serialVersionUID = 1L;
 
    private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("GuardaMunicipalPU");
    protected EntityManager em;
 
    private Class<T> entityClass;
    
    public void createEntityManager() {
        em = emf.createEntityManager();
    }

    //outros métodos de transação

   public List<T> buscarTodos() {
        CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
        cq.select(cq.from(entityClass));
        return em.createQuery(cq).getResultList();
    }

   //Getters e Setters
}

o método da classe DAO é usado na Classe EnderecoFacade.

EnderecoFacade.class

public List<Endereco> listarTodos() {
        enderecoDAO.beginTransaction();
        List<Endereco> resultado = enderecoDAO.buscarTodos(); //método dao
        enderecoDAO.closeTransaction();
        return resultado;
    }

e posteriormente na classe EnderecoMB.

EnderecoMB.class

public List<Endereco> getTodosEnderecos() {
        if(enderecos == null) {
            listarEnderecos() ;
        }
        return enderecos;
    }

public void listarEnderecos() {
        enderecos = enderecoFacade.listarTodos(); //método facade
    }

Na minha Página JSF esta assim:

indexEndereco.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui">
    
<h:body>
    <ui:composition template="/pages/protected/templates/master.xhtml">
        <ui:define name="divMain">
            <h:form id="formEnderecos">
                <p:dataTable id="tabelaEnderecos" value="#{enderecoMB.todosEnderecos}" var="endereco" emptyMessage="#{bundle.semDados}" paginator="true" rows="10"
                    paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                    rowsPerPageTemplate="5,10,15">
                    <p:column>
                        <f:facet name="header">
                            <h:outputText value="#{bundle.logradouro}" />
                        </f:facet>

                        <h:outputText value="#{endereco.logradouro}" />
                    </p:column>
                    
                     ...

Desde já agradeço galera, vlw.

7 Respostas

Lucas_Camara

Como você está criando a instância de enderecoFacade? Talvez ela que esteja nula.

R
Solucao aceita

Me parece que o objeto “enderecoFacade” está nulo. Você tem certeza que instanciou esse objeto na classe EnderecoMB antes de utilizá-lo?

B

desculpe a demora para responder, é que do nada apareceu um erro 502 e não estava conseguindo acessar o site.

Bom voltando ao tópico, eis a minha instância do enderecoFacade:

@ViewScoped
@ManagedBean(name = "enderecoMB")
public class EnderecoMB extends AbstractMB implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    private EnderecoFacade enderecoFacade;


 //Getter e Setter
public EnderecoFacade getEnderecoFacade() {
        if(enderecoFacade == null) {
            enderecoFacade = new EnderecoFacade();
        }
        return enderecoFacade;
    }

    public void setEnderecoFacade(EnderecoFacade enderecoFacade) {
        this.enderecoFacade = enderecoFacade;
    }
}
B

A instância estava feita dessa forma:

public class EnderecoMB extends AbstractMB implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    private EnderecoFacade enderecoFacade; //desta forma

//Get e Set
public EnderecoFacade getEnderecoFacade() {
        if(enderecoFacade == null) {
            enderecoFacade = new EnderecoFacade();
        }
        return enderecoFacade;
    }

    public void setEnderecoFacade(EnderecoFacade enderecoFacade) {
        this.enderecoFacade = enderecoFacade;
    }

mudei para:

private EnderecoFacade enderecoFacade = new EnderecoFacade();

E funcionou. Vivendo e aprendendo, Obrigado pela resposta nunca mais esqueço isso.

B
//mudei a declaração da instância e funcionou!!
    private EnderecoFacade enderecoFacade = new EnderecoFacade();

Obrigado pelo apoio aí, peguei este código em um exemplo e não prestei atenção neste detalhe, vlw pela dica, vivendo e aprendendo.

R

Na sua primeira implementação, o objeto enderecoFacade só seria instânciado quando você chamasse o método get dele, antes disso ele continuaria nulo.
Esses erros acontecem :wink:

B

eu sou meio novo em programação, aí ora ou outra levo uns coices desse. Ainda bem que há pessoas como vcs para nos ajudar, senão a cabeça ia fritar :joy:

Criado 11 de julho de 2016
Ultima resposta 12 de jul. de 2016
Respostas 7
Participantes 3