Meu JPAFilter não funciona com @ViewScoped

2 respostas
TiagoS

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?

2 Respostas

rezende.martins

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.

TiagoS

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

Criado 19 de janeiro de 2011
Ultima resposta 24 de jan. de 2011
Respostas 2
Participantes 2