Olá galera…
Estou desenvolvendo um sist. com JSF 2 + JPA + Spring, mais ainda não conheço muito e nunca tinha trabalhado com o Spring!!!
No meu sist. tem um menu de listagem de departamentos, que quando acionado, executa o método “listar()” do Managed Bean DepartamentoMBean!!
Mais quando isso acontece é exibida a seguinte mensagem de erro no console:
GRAVE: java.lang.NullPointerException
javax.faces.el.EvaluationException: java.lang.NullPointerException
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:98)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:98)
at javax.faces.component.UICommand.broadcast(UICommand.java:311)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:781)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1246)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:77)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
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.ce.mbean.DepartamentoMBean.listar(DepartamentoMBean.java:34)
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 org.apache.el.parser.AstValue.invoke(AstValue.java:262)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:102)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:84)
... 24 more
24/04/2012 16:58:36 com.sun.faces.lifecycle.InvokeApplicationPhase execute
AVISO: #{departamentoMBean.listar()}: java.lang.NullPointerException
javax.faces.FacesException: #{departamentoMBean.listar()}: java.lang.NullPointerException
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:114)
at javax.faces.component.UICommand.broadcast(UICommand.java:311)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:781)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1246)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:77)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
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: javax.faces.el.EvaluationException: java.lang.NullPointerException
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:98)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:98)
... 23 more
Caused by: java.lang.NullPointerException
at br.com.ce.mbean.DepartamentoMBean.listar(DepartamentoMBean.java:34)
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 org.apache.el.parser.AstValue.invoke(AstValue.java:262)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:102)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:84)
... 24 more
javax.faces.FacesException: #{departamentoMBean.listar()}: java.lang.NullPointerException
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:85)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
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: javax.faces.FacesException: #{departamentoMBean.listar()}: java.lang.NullPointerException
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:114)
at javax.faces.component.UICommand.broadcast(UICommand.java:311)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:781)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1246)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:77)
... 19 more
Caused by: javax.faces.el.EvaluationException: java.lang.NullPointerException
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:98)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:98)
... 23 more
Caused by: java.lang.NullPointerException
at br.com.ce.mbean.DepartamentoMBean.listar(DepartamentoMBean.java:34)
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 org.apache.el.parser.AstValue.invoke(AstValue.java:262)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:102)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:84)
... 24 more
O código do DepartamentoMBean é o seguinte:
package br.com.ce.mbean;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import br.com.ce.controller.DepartamentoFacade;
import br.com.ce.model.Departamento;
@ManagedBean
@SessionScoped
public class DepartamentoMBean {
@ManagedProperty("#{departamentoFacade}")
private DepartamentoFacade departamentoFacade;
private Departamento departamento = new Departamento();
private List<Departamento> departamentos = new ArrayList<Departamento>();
public void salvar()
{
this.departamentoFacade.salvar(this.departamento);
}
public void remover()
{
this.departamentoFacade.remover(this.departamento);
}
public String listar()
{
this.departamentos = this.departamentoFacade.listar();
return "listaDepartamento";
}
public Departamento getDepartamento() {
return this.departamento;
}
public void setDepartamento(Departamento departamento) {
this.departamento = departamento;
}
public List<Departamento> getDepartamentos() {
return this.departamentos;
}
public void setDepartamentos(List<Departamento> departamentos) {
this.departamentos = departamentos;
}
public DepartamentoFacade getDepartamentoFacade() {
return this.departamentoFacade;
}
public void setDepartamentoFacade(DepartamentoFacade departamentoFacade) {
this.departamentoFacade = departamentoFacade;
}
}
Me parece que o Spring não está injetando o “departamentoFacade” (que é o componente da camada de serviço) no MBean!!!
O código do DepartamentoFacade é o seguinte:
package br.com.ce.controller;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import br.com.ce.dao.impl.DepartamentoDao;
import br.com.ce.model.Departamento;
@Service("departamentoFacade")
public class DepartamentoFacade {
@Autowired
private DepartamentoDao departamentoDao;
public DepartamentoFacade() {}
public void salvar(Departamento departamento)
{
this.departamentoDao.insert(departamento);
}
public void remover(Departamento departamento)
{
try {
this.departamentoDao.deleteByID(departamento.getCodigo());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public List<Departamento> listar()
{
Collection<Departamento> departamentos = new ArrayList<Departamento>();
try {
departamentos = this.departamentoDao.listAll();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return (List<Departamento>) departamentos;
}
public void setDepartamentoDao(DepartamentoDao departamentoDao) {
this.departamentoDao = departamentoDao;
}
}
Acredito que o Spring tb não injetará o “DepartamentoDao” no “DepartamentoFacade”.
Código DepartamentoDao:
package br.com.ce.dao.impl;
import java.util.Collection;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.hibernate.Session;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import br.com.ce.model.Departamento;
@Repository("departamentoDao")
@Transactional
public class DepartamentoDao {
@PersistenceContext
private EntityManager entityManager;
public DepartamentoDao() {}
public void insert(Departamento departamento) {
try {
Object id = departamento.getCodigo();
if( id != null ){
this.entityManager.merge(departamento);
}
else{
this.entityManager.persist(departamento);
this.entityManager.flush();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
public void delete(Departamento departamento) {
this.entityManager.remove(departamento);
}
public void deleteByID(Long entityID) {
this.delete(this.selectByID(entityID));
}
@Transactional(propagation=Propagation.SUPPORTS, readOnly=true)
public Collection<Departamento> listAll() {
return this.hqlQuery("from " + Departamento.class).list();
}
@Transactional(propagation=Propagation.SUPPORTS, readOnly=true)
public Departamento selectByID(Long entityID) {
return this.entityManager.find(Departamento.class, entityID);
}
public org.hibernate.Query hqlQuery(String commandHQL) {
return this.getSession().createQuery((commandHQL == null ? "" : commandHQL)).setCacheable(true);
}
public Session getSession() {
return ((Session) this.entityManager.getDelegate());
}
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
}
applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- Seta anotaçoes para serem usadas pelo Spring -->
<context:annotation-config />
<!-- Define o pacote onde o Spring vai procurar por beans anotados -->
<context:component-scan base-package="br.com.ce.controller,br.com.ce.dao,br.com.ce.dao.impl" />
<!-- define que as transaçoes irao ser anotadas -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="equipamentoFacade" class="br.com.ce.controller.EquipamentoFacade">
<property name="equipamentoDao" ref="equipamentoDao" />
</bean>
<bean id="departamentoFacade" class="br.com.ce.controller.DepartamentoFacade">
<property name="departamentoDao" ref="departamentoDao" />
</bean>
<bean id="funcionarioFacade" class="br.com.ce.controller.FuncionarioFacade">
<property name="funcionarioDao" ref="funcionarioDao" />
</bean>
<bean id="equipamentoDao" scope="prototype" class="br.com.ce.dao.impl.EquipamentoDao" />
<bean id="departamentoDao" scope="prototype" class="br.com.ce.dao.impl.DepartamentoDao" />
<bean id="funcionarioDao" scope="prototype" class="br.com.ce.dao.impl.FuncionarioDao" />
<!-- Configuracao do Banco de Dados -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.postgresql.Driver" />
<property name="url" value="jdbc:postgresql://linux4.faespsenar.com.br:5432/pg_ce" />
<property name="username" value="faespsenar" />
<property name="password" value="!faespsenar@" />
</bean>
<!-- Configuracao do Hibernate -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="ce" />
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="showSql" value="true" />
</bean>
</property>
</bean>
<!-- Configuracao do gerente de transacoes do Spring -->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
</beans>
Alguém sabe me dizer oq estou fazendo de errado??? Obrigado.