Meu JPAFilter não funciona com @ViewScoped

2 respostas
T

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

R

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.

T

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