2012-09-28 34 views
0

将managedBean的作用域设置为ViewScoped时,出现以下错误。以下是我在尝试调用页面时遇到的异常:在java.io.NotSerializableException中更改查看范围结果的请求:javax.faces.model.ListDataModel

javax.faces.FacesException: java.io.NotSerializableException: javax.faces.model.ListDataModel 
at com.sun.faces.renderkit.ResponseStateManagerImpl.getViewState(ResponseStateManagerImpl.java:137) 
at javax.faces.application.StateManager.getViewState(StateManager.java:555) 
at com.sun.faces.context.PartialViewContextImpl.renderState(PartialViewContextImpl.java:416) 
at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:300) 
at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:183) 
at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:981) 
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1756) 
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:390) 
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) 
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) 
at java.lang.Thread.run(Unknown Source) 
Caused by: java.io.NotSerializableException: javax.faces.model.ListDataModel 
at java.io.ObjectOutputStream.writeObject0(Unknown Source) 



Sep 26, 2012 4:01:13 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet Faces Servlet threw exception 
java.lang.IllegalStateException: CDATA tags may not nest 
at   com.sun.faces.renderkit.html_basic.HtmlResponseWriter.startCDATA(HtmlResponseWriter.java:630) 
at javax.faces.context.ResponseWriterWrapper.startCDATA(ResponseWriterWrapper.java:172) 
at javax.faces.context.PartialResponseWriter.startError(PartialResponseWriter.java:342) 
at org.primefaces.context.PrimePartialResponseWriter.startError(PrimePartialResponseWriter.java:210) 
at com.sun.faces.context.AjaxExceptionHandlerImpl.handlePartialResponseError(AjaxExceptionHandlerImpl.java:200) 
at com.sun.faces.context.AjaxExceptionHandlerImpl.handle(AjaxExceptionHandlerImpl.java:123) 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119) 

任何指针或帮助解决问题都非常敏感。提前致谢。

回答

4

java.io.NotSerializableException:javax.faces.model.ListDataModel

你的看法范围的bean显然已经一个ListDataModel属性。这实际上是不可序列化的,因为它的状态每个定义都依赖于当前的HTTP请求(通常不需要在任何地方保存/共享 - 这又将需要序列化)。

视图范围的bean横跨多个HTTP请求,并且由存储HTTP会话的唯一密钥来代替。有些但不是所有servlet容器都将会话存储在硬盘上而不是内存中,这需要直接存储在会话中的所有Java对象实现Serializable,包括视图范围的bean及其所有属性。

您可以通过两种方式解决这个具体问题:

  1. 马克财产transient,拿到包裹清单,他人财产的持有,并在吸气使用延迟加载。

    private transient DataModel<Foo> model; 
    private List<Foo> list; 
    
    public DataModel<Foo> getModel() { 
        if (model == null) { 
         model = new ListDataModel<Foo>(list); 
        } 
        return model; 
    } 
    
  2. 不要使用DataModel,而是用另一种代替。对于具有DataModel的常见要求是JSF 1.x能够获取当前行。但是从EL 2.2开始,你可以将它作为方法参数传递。另请参见How can I pass selected row to commandLink inside dataTable?

+0

非常感谢Balusc的详细解释。我将DataModel设置为transient.But,但它仍然抛出java.io.NotSerializableException异常。我在我的项目中包含了spring,并且它在下面的行中的jar文件中引发了此异常。“SEVERE:渲染视图时出错[/ui/ScheduleDetails.xhtml] javax.faces.FacesException:java.io.NotSerializableException:org。 springframework.web.context.support.XmlWebApplicationContext”。你能否让我知道我能做些什么来解决这个问题。在此先感谢 – vr3w3c9

+0

这部分超越了我。我只能说,这不是我第一次看到Spring没有正确处理序列化。 Java EE 6标准CDI/EJB(Spring应该取代旧的J2EE时代)就是这样做的。 – BalusC