JSF 2.0 + JPA - java.lang.NullPointerException

Pessoal, já estou com este problema a 2 semanas, já fiz tudo que eu achei que era possível para resolver este problema e nada, se alguém puder me ajudar agradeço muito.

O problema é o seguinte: estou desenvolvendo um programa para web, e na tela de cadastro quando clico em salvar ele me retorna o seguinte erro:

SEVERE: 'java.lang.NullPointerException' recebido ao invocar escuta de ação '#{empresaMB.save()}' para o componente 'j_idt30'
SEVERE: java.lang.NullPointerException
	at hibernate.dao.EmpresaDAO.save(EmpresaDAO.java:24)
	at advogado.managedbean.CadEmpresaMB.save(CadEmpresaMB.java:32)
	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.invokeMethod(BeanELResolver.java:779)
	at javax.el.BeanELResolver.invoke(BeanELResolver.java:528)
	at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:257)
	at com.sun.el.parser.AstValue.invoke(AstValue.java:248)
	at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:302)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:148)
	at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
	at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
	at javax.faces.component.UICommand.broadcast(UICommand.java:300)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:722)

SEVERE: JSF1073: javax.faces.event.AbortProcessingException obtido durante o processamento de INVOKE_APPLICATION 5: UIComponent-ClientId=cadastro:j_idt30, Message=/cad-empresa.xhtml @100,28 actionListener="#{empresaMB.save()}": java.lang.NullPointerException
SEVERE: /cad-empresa.xhtml @100,28 actionListener="#{empresaMB.save()}": java.lang.NullPointerException
javax.faces.event.AbortProcessingException: /cad-empresa.xhtml @100,28 actionListener="#{empresaMB.save()}": java.lang.NullPointerException
	at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:182)
	at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
	at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
	at javax.faces.component.UICommand.broadcast(UICommand.java:300)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.NullPointerException
	at hibernate.dao.EmpresaDAO.save(EmpresaDAO.java:24)
	at advogado.managedbean.CadEmpresaMB.save(CadEmpresaMB.java:32)
	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.invokeMethod(BeanELResolver.java:779)
	at javax.el.BeanELResolver.invoke(BeanELResolver.java:528)
	at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:257)
	at com.sun.el.parser.AstValue.invoke(AstValue.java:248)
	at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:302)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:148)
	... 33 more

E as telas onde o erro esta se referindo são estas:

[color=red]ManagedBean[/color]

package advogado.managedbean;

import hibernate.dao.EmpresaDAO;

import java.io.Serializable;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletRequest;

import advogado.pojo.CadEmpresa;

@ManagedBean(name = "empresaMB")
@SessionScoped
public class CadEmpresaMB implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private CadEmpresa cadEmpresa = new CadEmpresa();
	private List<CadEmpresa> cadEmpresas;

	// salvar
	public String save() {
		EmpresaDAO empresaDAO = new EmpresaDAO(this.getManager());
		empresaDAO.save(this.cadEmpresa);

		this.cadEmpresa = new CadEmpresa();
		this.cadEmpresas = null;
		
		return "confirm";

	}

	// get e set

	private EntityManager getManager() {
		FacesContext fc = FacesContext.getCurrentInstance();
		ExternalContext ec = fc.getExternalContext();
		HttpServletRequest request = (HttpServletRequest) ec.getRequest();
		return (EntityManager) request.getAttribute("entityManager");
	}

	public CadEmpresa getCadEmpresa() {
		return cadEmpresa;
	}

	public void setCadEmpresa(CadEmpresa cadEmpresa) {
		this.cadEmpresa = cadEmpresa;
	}

}

[color=red]DAO[/color]

package hibernate.dao;

import java.io.Serializable;

import javax.persistence.EntityManager;

import advogado.pojo.CadEmpresa;

public class EmpresaDAO implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private EntityManager entityManager;

	//construtor
	public EmpresaDAO(EntityManager entityManager) {
		this.entityManager = entityManager;
	}

	//salvar
	public void save(CadEmpresa cadEmpresa) {
		this.entityManager.persist(cadEmpresa);
		this.entityManager.flush();
	}
}

[color=red]E para completar, a classe que cria a conexão com o banco [/color]

package jpautil.filters;

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 JPAUtil implements Filter {

	private EntityManagerFactory entityManagerFactory;

	@Override
	public void destroy() {
		this.entityManagerFactory.close();

	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc)
			throws IOException, ServletException {

		EntityManager entityManager = this.entityManagerFactory
				.createEntityManager();
		req.setAttribute("entityManager", entityManager);

		entityManager.getTransaction().begin();

		fc.doFilter(req, res);

		try {
			entityManager.getTransaction().commit();
		} catch (Exception e) {
			entityManager.getTransaction().rollback();
			throw new ServletException(e.toString());
		} finally {
			entityManager.close();
			System.out.println("Conexão fechada!!!");
		}

	}

	@Override
	public void init(FilterConfig fc) throws ServletException {
		this.entityManagerFactory = Persistence
				.createEntityManagerFactory("advocacia");

	}

}

[color=darkred]
Por favor alguém me ajude.
Obrigado.
[/color]

Segundo o log de erro, o problema encontra-se na linha 24 da classe EmpresaDAO, “at hibernate.dao.EmpresaDAO.save(EmpresaDAO.java:24)”. Insira um breaking point e depure o código para verificar qual objeto está nulo. Vamos começar por este ponto.

Espero ter ajudado.

Obs.: Já testou se sua conexão ao banco está ok?

Você instanciou seu entity manager?

[quote=LeonardoU]Segundo o log de erro, o problema encontra-se na linha 24 da classe EmpresaDAO, “at hibernate.dao.EmpresaDAO.save(EmpresaDAO.java:24)”. Insira um breaking point e depure o código para verificar qual objeto está nulo. Vamos começar por este ponto.

Espero ter ajudado.

Obs.: Já testou se sua conexão ao banco está ok?[/quote]

Leonardo eu testei a comunicação com o banco e esta tudo blz.
Coloquei o breaking point no local onde o sistema informa o erro mas não consegui detectar o objeto que esta nulo.

Obrigado.

Boa tarde Hebert.

Se eu não estiver engana o meu entity esta sendo instanciado na class EmpresaDAO.
E no caso do filtro eu configurei pelo web.xml

Eu acho que identifiquei onde esta o problema, mas ainda não consegui resolver, eu estou achando que o problema esta no meu filtro, na configuração do meu web.xml

Será que apenas olhando alguém consegue detectar o problema?

[color=red]web.xml[/color]

<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">

	<display-name>Advogado</display-name>

	<welcome-file-list>
		<welcome-file>main-admin.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>*.xhtml</url-pattern>
	</servlet-mapping>

	<context-param>
		<description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
		<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
		<param-value>client</param-value>
	</context-param>

	<context-param>
		<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
		<param-value>resources.application</param-value>
	</context-param>

	<listener>
		<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
	</listener>

</web-app>

Obrigado.

Olá,

Boa tarde Hebert.

Se eu não estiver engana o meu entity esta sendo instanciado na class EmpresaDAO.
E no caso do filtro eu configurei pelo web.xml[/quote]

Não exatamente. Se você não fez algo como entityManager = new EntityManager[…], você não está instanciando no DAO. Creio que você está usando injeção de dependencia, mas, isso não é feito no web.xml (pode ser via outro XML ou com anotações). Você está usando CDI ou Spring (ou algum outro framework)?

[quote=Alys]Olá,

Boa tarde Hebert.

Se eu não estiver engana o meu entity esta sendo instanciado na class EmpresaDAO.
E no caso do filtro eu configurei pelo web.xml[/quote]

Não exatamente. Se você não fez algo como entityManager = new EntityManager[…], você não está instanciando no DAO. Creio que você está usando injeção de dependencia, mas, isso não é feito no web.xml (pode ser via outro XML ou com anotações). Você está usando CDI ou Spring (ou algum outro framework)?[/quote]

Boa noite Alys,

Neste programa a classe responsável pela comunicação com o banco é a “JPAUtil” e nesta classe tem este código:

@WebFilter(servletNames = { "Faces Servlet" }) 

e no web.xml ele fez uma referencia automaticamente com este nome “Faces Servlet” eu imaginei que isto seria o responsável pela comunicação da classe “JPAUtil” com as minhas outras classes, mas pelo visto o meu problema esta sendo exatamente neste ponto, e eu imagino que terei que fazer esta intermediação dentro do web.xml né?
O que você me sugere a fazer?
O servidor de aplicação que eu estou usando é o GlassFish, e o frameworks é o Hibernate e o PrimeFaces.

Oi River,

O web.xml é um descritor de implantação apenas. Você faz mapeamento de urls com servlets, configura filtros, controla autenticação, mas é só isso. A configuração da parte de persistência não é feita nele (ao menos não que eu saiba, e não creio que seria o local mais apropriado).

Debuga o método getManager() na classe CadEmpresaMB e verifique se o entity manager está sendo inicializado corretamente. Veja se o filtro é executado da forma como deveria, e, mais importante, no momento em que deveria (antes da execução do managed bean), e se está setando o valor correto na sessão.

Minha sugestão: eu honestamente faria uma abordagem diferente (já que você está usando o Glassfish), sem utilizar filtros. Outras pessoas aqui no fórum já tiveram problemas usando essa abordagem que você tentou, e acabaram mudando um pouco, veja este caso.

[quote=Alys]Oi River,

O web.xml é um descritor de implantação apenas. Você faz mapeamento de urls com servlets, configura filtros, controla autenticação, mas é só isso. A configuração da parte de persistência não é feita nele (ao menos não que eu saiba, e não creio que seria o local mais apropriado).

Debuga o método getManager() na classe CadEmpresaMB e verifique se o entity manager está sendo inicializado corretamente. Veja se o filtro é executado da forma como deveria, e, mais importante, no momento em que deveria (antes da execução do managed bean), e se está setando o valor correto na sessão.

Minha sugestão: eu honestamente faria uma abordagem diferente (já que você está usando o Glassfish), sem utilizar filtros. Outras pessoas aqui no fórum já tiveram problemas usando essa abordagem que você tentou, e acabaram mudando um pouco, veja este caso.[/quote]

Alys, o Glassfish não é uma boa opção? Eu pensei em usar no inicio o Tomcat, mas vi que ele não suporta o JEE, por isso optei pelo Glassfish.
Este problema que eu estou tendo, será que não resolveria se eu usasse o spring?

Obrigado.

River,

Na realidade nunca trabalhei com Glassfish, mas, mencionei isso porque a abordagem do link que postei não funcionaria se você estivesse usando, por exemplo, Tomcat :wink:

O uso de alguma ferramenta de injeção de dependência resolveria seu problema, e, sim, o Spring é uma das opções que você pode adotar. Eu usava Spring até um tempo atrás, e sempre achei muito bom.

Vou dar uma estudada no Spring então. :wink:

Alys obrigado pela ajuda e pela atenção, abraço.