Meu JPAFilter não funciona com @ViewScoped

Estou fazendo um sistema com base na apostila “Desenvolvimento JSF2 e JPA2” da K19 treinamentos. Os meus beans de escopo request funcionam normalmente, no entanto nos beans que são do tipo view esse filtro não funciona.
Segue o erro que da.

19/01/2011 10:25:21 com.sun.faces.mgbean.BeanManager preProcessBean

GRAVE: O JSF estará indisponível para criar o bean gerenciado certificadoCalibracaoBean quando ele for solicitado. Os seguintes problemas foram encontrados:
- O escopo do objeto referido pela expressão #{entityManager}, request, é menor do que o escopo do bean gerenciado referido (certificadoCalibracaoBean) de view

19/01/2011 10:25:21 com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
GRAVE: Error Rendering View[/aprCertificadoCalibracao.xhtml]
com.sun.faces.mgbean.ManagedBeanCreationException: Não foi possível criar o bean gerenciado certificadoCalibracaoBean. Os seguintes problemas foram encontrados:
- O escopo do objeto referido pela expressão #{entityManager}, request, é menor do que o escopo do bean gerenciado referido (certificadoCalibracaoBean) de view
at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:261)
at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:191)
at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:73)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:55)
at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:71)
at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:71)
at org.apache.el.parser.AstValue.getValue(AstValue.java:147)
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 org.primefaces.component.datatable.DataTable.getSelection(DataTable.java:218)
at org.primefaces.component.datatable.DataTableRenderer.encodeTbody(DataTableRenderer.java:397)
at org.primefaces.component.datatable.DataTableRenderer.encodeMarkup(DataTableRenderer.java:164)
at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:80)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:879)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1650)
at javax.faces.render.Renderer.encodeChildren(Renderer.java:164)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:849)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1643)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646)
at org.primefaces.component.tabview.TabViewRenderer.encodeContents(TabViewRenderer.java:181)
at org.primefaces.component.tabview.TabViewRenderer.encodeMarkup(TabViewRenderer.java:121)
at org.primefaces.component.tabview.TabViewRenderer.encodeEnd(TabViewRenderer.java:62)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:879)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1650)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646)
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 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:306)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at potencial.core.filter.JPAFilter.doFilter(JPAFilter.java:26)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:244)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at potencial.core.filter.JPAFilter.doFilter(JPAFilter.java:26)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:244)
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:161)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:237)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:281)
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)
19/01/2011 10:25:21 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/core] threw exception [Não foi possível criar o bean gerenciado certificadoCalibracaoBean. Os seguintes problemas foram encontrados:
- O escopo do objeto referido pela expressão #{entityManager}, request, é menor do que o escopo do bean gerenciado referido (certificadoCalibracaoBean) de view] with root cause
com.sun.faces.mgbean.ManagedBeanCreationException: Não foi possível criar o bean gerenciado certificadoCalibracaoBean. Os seguintes problemas foram encontrados:
- O escopo do objeto referido pela expressão #{entityManager}, request, é menor do que o escopo do bean gerenciado referido (certificadoCalibracaoBean) de view
at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:261)
at com.sun.faces.el.ManagedBeanELResolver.resolveBean(ManagedBeanELResolver.java:191)
at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:73)
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:55)
at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:71)
at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:71)
at org.apache.el.parser.AstValue.getValue(AstValue.java:147)
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 org.primefaces.component.datatable.DataTable.getSelection(DataTable.java:218)
at org.primefaces.component.datatable.DataTableRenderer.encodeTbody(DataTableRenderer.java:397)
at org.primefaces.component.datatable.DataTableRenderer.encodeMarkup(DataTableRenderer.java:164)
at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:80)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:879)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1650)
at javax.faces.render.Renderer.encodeChildren(Renderer.java:164)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:849)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1643)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646)
at org.primefaces.component.tabview.TabViewRenderer.encodeContents(TabViewRenderer.java:181)
at org.primefaces.component.tabview.TabViewRenderer.encodeMarkup(TabViewRenderer.java:121)
at org.primefaces.component.tabview.TabViewRenderer.encodeEnd(TabViewRenderer.java:62)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:879)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1650)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1646)
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 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:306)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at potencial.core.filter.JPAFilter.doFilter(JPAFilter.java:26)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:244)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at potencial.core.filter.JPAFilter.doFilter(JPAFilter.java:26)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:244)
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:161)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:237)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:281)
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)

Já fazem dias que estou em cima desse erro, e nada.
Aguém que já passou por isso pode me ajudar por favor?

Olá Tiago,

O problema é o seguinte:

O EntityManager criado no filtro é colocado no escopo de Request. Dessa forma, você não pode injetá-lo em um ManagedBean com escopo maior do que request. Dá uma olhada neste trecho da especificação do JSF 2:

[P1-start managed bean scope errors]
It is an error for a managed bean created through this facility to have a property
that points at an object stored in a scope with a (potentially) shorter life span. Specifically, this means, for an object
created with the specified , then evaluations can only point at created objects
with the specified managed bean scope:

  • none – none
  • application – none, application
  • session – none, application, session
  • view – none, application, session, view
  • request – none, application, session, view, request
    [P1-end]

Para contornar este problema, você deve retirar dos ManagedBeans com escopo maior do que request a anotação @ManagedProperty que injeta o EntityManager. E toda vez que quiser acessar o EntityManager do escopo de request deve utilizar o seguinte trecho de código dentro dos ManagedBeans:

ELContext elContext = FacesContext.getCurrentInstance().getELContext(); this.entityManager = (EntityManager) FacesContext.getCurrentInstance().getApplication() .getELResolver().getValue(elContext, null, "entityManager");

Você também pode colocar o EntityManager no escopo de sessão, contudo isto pode gerar alguns problemas.

muito obrigado mesmo Rezende, já fazia dias que estava com esse problema