[Resolvido]Ajuda com NullPointerException

Boa Tarde Senhores,

Estou quebrando a cabeça há algum tempo com o erro nullPointerException no JSF.
Irei postar o código das classe aqui e o erro, gostaria de uma ajuda de vocês para indentificar onde está o problema.

package br.com.repositorio;
/*
 * Classe UsuarioRep.java
 */
import java.util.List;


import javax.persistence.EntityManager;
import javax.persistence.Query;


import br.com.bean.Usuario;

public class UsuarioRep {
	private EntityManager entityManager;
	
	public UsuarioRep(EntityManager entityManager) {
		this.entityManager = entityManager;
		
	}
	
	public List<Usuario> getUsuarios(){
		Query query = this.entityManager.createQuery("select * from usuario;");
		return query.getResultList();
	}

}
package br.com.bean;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

/*
 * Classe Usuario.java
 */
@Entity
public class Usuario {
	@Id @GeneratedValue
	private Long id;
	private String nome;
	private String sobrenome;
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getSobrenome() {
		return sobrenome;
	}
	public void setSobrenome(String sobrenome) {
		this.sobrenome = sobrenome;
	}

}
package br.com.bean;
/*
 * Classe UsuarioBean.java
 */
import java.util.List;

import javax.faces.bean.ManagedProperty;
import javax.persistence.EntityManager;

import br.com.repositorio.UsuarioRep;

public class UsuarioBean {
	@ManagedProperty(value = "{#entityManager}")
	private EntityManager entityManager;
	
	
	private List<Usuario> usuarios;
	
	public List<Usuario> getUsuarios(){
		if(this.usuarios == null){
		System.out.println("CHAMANDO O REPOSITÓRIO!!");
		UsuarioRep urep = new UsuarioRep(this.entityManager);
		this.usuarios = urep.getUsuarios();
		}
		return this.usuarios;
		}

}

Arquivo listaUsuarios.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:a4j="http://richfaces.org/a4j"
      xmlns:rich="http://richfaces.org/rich"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"> 

<h:head></h:head> 
<body>
  	<h:dataTable id="tabela" value="#{usuarioBean.usuarios}" var="usuario">
  		<h:column>
  			<f:facet name="header">
  				<h:outputText value="Id" />
  			
  			</f:facet>
  			#{usuario.id}
  		</h:column>
  		<h:column>
  			<f:facet name="header">
  				<h:outputText value="Nome" />
  			</f:facet>
  			#{usuario.nome}
  		</h:column>
  		<h:column>
  			<f:facet name="header">
  				<h:outputText value="Sobrenome" />
  			</f:facet>
  			#{usuario.sobrenome}
  		</h:column>
  	</h:dataTable>
</body> 
</html>

Abaixo erro que corre ao tentar acessar a pagina listaUsuarios.xhtml

java.lang.NullPointerException
at br.com.repositorio.UsuarioRep.getUsuarios(UsuarioRep.java:23)
at br.com.bean.UsuarioBean.getUsuarios(UsuarioBean.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:87)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67)
at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:71)
at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:106)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:178)
at javax.faces.component.UIData.getValue(UIData.java:554)
at javax.faces.component.UIData.getDataModel(UIData.java:1278)
at javax.faces.component.UIData.setRowIndex(UIData.java:447)
at com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:77)
at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:824)
at javax.faces.component.UIData.encodeBegin(UIData.java:937)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1641)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:389)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:127)
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:269)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:117)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:135)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:309)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Agradeço desde já…
Obrigado

  Query query = this.entityManager.createQuery("select * from usuario;");  

não seria esse “;” que ta te atrapalhando Query?
tenta assim:

  Query query = this.entityManager.createQuery("select * from usuario");  

Tentei das duas formas, porém acontece o mesmo erro.

EntityManager tem instância?

Bom, creio que sim, estou seguindo um exemplo da apostila da k19 Desenvolvimento web com jsf e jpa.

Oi!

O problema na minha opinião, é referente a injeção do EntityManager.
Eu nunca usei dessa forma, era simplesmente usando o annotation PersistenceContext:

@PersistenceContext(name="nome") EntityManager em;

O nome é de acordo com a configuração do seu persistence-xml.
Tente :slight_smile:

Abraços.

O correto no UsuarioBean seria

@ManagedProperty(value = "#{entityManager}")

E seguindo a apostila você criou os filtros que ela pede? Interceptando o Faces Servlet, aonde é criada a instância do EntityManager?

fredericomaia10,

Criei o filtro conforme está na apostila.

Realizei a alteração para:

public class UsuarioBean {
	@ManagedProperty(value = "#{entityManager}")

mais ainda esta ocorrendo o erro:

AVISO: JSF1063: AVISO! Definindo valor de atributo não serializável em HttpSession (chave: usuarioBean, classe do valor: br.com.bean.UsuarioBean).
08/09/2011 14:34:09 com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
GRAVE: Error Rendering View[/listaUsuarios.xhtml]
javax.el.ELException: /listaUsuarios.xhtml @11,75 value="#{usuarioBean.usuarios}": Error reading ‘usuarios’ on type br.com.bean.UsuarioBean
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:111)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190)
at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:178)
at javax.faces.component.UIData.getValue(UIData.java:554)
at javax.faces.component.UIData.getDataModel(UIData.java:1278)
at javax.faces.component.UIData.setRowIndex(UIData.java:447)
at com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:77)
at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:824)
at javax.faces.component.UIData.encodeBegin(UIData.java:937)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1641)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:389)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:127)
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:269)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:117)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:135)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:309)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at br.com.repositorio.UsuarioRep.getUsuarios(UsuarioRep.java:23)
at br.com.bean.UsuarioBean.getUsuarios(UsuarioBean.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:87)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67)
at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:71)
at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:106)
… 33 more
CHAMANDO O REPOSITÓRIO!!
CHAMANDO O REPOSITÓRIO!!

Outro detalhe, sua classe UsuarioBean precisa estar anotada como ManagedBean, importando-a do javax.faces…

@ManagedBean public class UsuarioBean { @ManagedProperty(value = "#{entityManager}")

Vc esta trabalhando com Objeto relacional?..então a sua query vai ficar assim:

Query query = this.entityManager.createQuery("select u from Usuario u"); //Usuario representa a sua Classe Usuario que é o seu POJO

Adicionei a anotação @ManagedBean na classe usuário e também modifiquei a query, mais o erro continua.

Query query = this.entityManager.createQuery("select u from Usuario u");

Os erro aponta para essa linha.

Query q = this.entityManager.createQuery("select u FROM Usuario u");

Sera que há algo de errado no método abaixo?

	public List<Usuario> getUsuarios(){
		Query q = this.entityManager.createQuery("select u FROM Usuario u");
		return q.getResultList();
	}

O erro continua o mesmo?

NullPointerException ?

Segue o erro…

08/09/2011 15:54:24 com.sun.faces.context.SessionMap put
AVISO: JSF1063: AVISO! Definindo valor de atributo não serializável em HttpSession (chave: usuarioBean, classe do valor: br.com.bean.UsuarioBean).
CHAMANDO O REPOSITÓRIO!!
08/09/2011 15:54:24 com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
GRAVE: Error Rendering View[/listaUsuarios.xhtml]
javax.el.ELException: /listaUsuarios.xhtml @11,75 value="#{usuarioBean.usuarios}": Error reading 'usuarios' on type br.com.bean.UsuarioBean
	at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:111)
	at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:190)
	at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:178)
	at javax.faces.component.UIData.getValue(UIData.java:554)
	at javax.faces.component.UIData.getDataModel(UIData.java:1278)
	at javax.faces.component.UIData.setRowIndex(UIData.java:447)
	at com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:77)
	at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:824)
	at javax.faces.component.UIData.encodeBegin(UIData.java:937)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1641)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:389)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:127)
	at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:269)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:117)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:135)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:309)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
	at br.com.repositorio.UsuarioRep.getUsuarios(UsuarioRep.java:23)
	at br.com.bean.UsuarioBean.getUsuarios(UsuarioBean.java:24)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at javax.el.BeanELResolver.getValue(BeanELResolver.java:87)
	at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:67)
	at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:71)
	at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
	at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
	at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:106)
	... 34 more
CHAMANDO O REPOSITÓRIO!!

Acredito que o seu EntityManager continua não sendo injetado.

Posta o código dos filtros JPA que você criou.

Oi!

Qual Container Web está utilizando?
Poste o seu persistence-xml, fazendo o favor.
E tentou conforme eu disse?

Abraços.

nel, tentei sim como você falou mais tambem não deu.
Estou utilizando o apache tomcat 7.

Segue código do persistence.xml e do FiltroJPa.

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="crep">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>br.com.bean.Usuario</class>
<properties>
<property name="hibernate.dialect"
    value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="javax.persistence.jdbc.driver"
    value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.url"
    value="jdbc:mysql://localhost/crep" />
<property name="javax.persistence.jdbc.user" value="root" />
<property name="javax.persistence.jdbc.password" value="" />
</properties>
</persistence-unit>
</persistence>

JPAFilter.java

package br.com.filtros;

import java.io.IOException;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter(servletNames = {"Faces Servlet"})
public class JPAFilter implements Filter {
	
	private EntityManagerFactory factory;
	
    public JPAFilter() {
        // TODO Auto-generated constructor stub
    }

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		
		EntityManager entityManager = this.factory.createEntityManager();
		request.setAttribute("entityManager", entityManager);
		entityManager.getTransaction().begin();
		
		chain.doFilter(request, response);
		
		try{
			entityManager.getTransaction().commit();
		}catch(Exception e){
			entityManager.getTransaction().rollback();
		}finally{
			entityManager.close();
		}
	}
	public void init(FilterConfig fConfig) throws ServletException {
		this.factory = Persistence.createEntityManagerFactory("crep");
	}
	
	public void destroy() {
		this.factory.close();
	}

}

Oi!

Lá no seu Bean, tente:

@PersistenceContext(name="crep") EntityManager em;

Ou somente @PersistenceContext sem o nome.
É para injetar, no JBoss 4.2.3 isso era possível, creio que no Tomcat 7 seja igual.

Estranho, aparentemente está tudo certo.

nel a anotação @PersitenceContext não vai funcionar, só server para Servidores JEE, o Tomcat é só um Web Containter, não consegue injetar sozinho os EntityManager.

[quote=fredericomaia10]Estranho, aparentemente está tudo certo.

nel a anotação @PersitenceContext não vai funcionar, só server para Servidores JEE, o Tomcat é só um Web Containter, não consegue injetar sozinho os EntityManager.[/quote]

É verdade.
Efetuei minha base no JBoss, que é completamente diferente do Tomcat 7.

Bem observado :slight_smile:

nicocelli você está deixando a criação das tabelas do Banco de Dados para a JPA fazer, certo?

As tabelas e colunas foram criadas automaticamente quando você acessou a aplicação? Verifique seu BD.