2013-10-09 2 views
1

Я переношу наш проект jsf на Spring Webflow + JSF. Мы используем ehcache для хранения информации о чатах и ​​данных пользователей. Класс Dpwb (сериализованный) извлекает данные из ehcache. До тех пор, пока класс Dpwb сериализуется, он должен работать, почему он ищет сериализацию ehcache, и я ничего не могу с этим поделать.java.io.NotSerializableException: net.sf.ehcache.Cache в Spring Webflow project

flow.xml

<flow xmlns="http://www.springframework.org/schema/webflow" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/webflow 
     http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd"> 

    <var name="wbIdentifiers" class="com.emyed.whiteboard.controller.WhiteboardIdentifiers" /> 
    <view-state id="createWb" view="createdialog.xhtml"> 
     <transition on="create" to="wboard"> 
      <evaluate expression="generalCreateWhiteboard.create()" 
       result="wbIdentifiers" /> 
     </transition> 
    </view-state> 


    <view-state id="wboard" view="/WEB-INF/views/D/whiteboard.xhtml"> 
     <on-render> 
      <evaluate expression="generalCreateWhiteboard.setDisplayWhiteboard(wbIdentifiers)" result="viewScope.dpwb "></evaluate> 
     </on-render> 
    </view-state> 

</flow> 

Исключение

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.webflow.execution.repository.snapshot.SnapshotCreationException: Could not serialize flow execution; make sure all objects stored in flow or flash scope are serializable 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:948) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
root cause 

org.springframework.webflow.execution.repository.snapshot.SnapshotCreationException: Could not serialize flow execution; make sure all objects stored in flow or flash scope are serializable 
    org.springframework.webflow.execution.repository.snapshot.SerializedFlowExecutionSnapshot.<init>(SerializedFlowExecutionSnapshot.java:75) 
    org.springframework.webflow.execution.repository.snapshot.SerializedFlowExecutionSnapshotFactory.createSnapshot(SerializedFlowExecutionSnapshotFactory.java:70) 
    org.springframework.webflow.execution.repository.snapshot.AbstractSnapshottingFlowExecutionRepository.snapshot(AbstractSnapshottingFlowExecutionRepository.java:75) 
    org.springframework.webflow.execution.repository.impl.DefaultFlowExecutionRepository.putFlowExecution(DefaultFlowExecutionRepository.java:126) 
    org.springframework.webflow.executor.FlowExecutorImpl.resumeExecution(FlowExecutorImpl.java:171) 
    org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:183) 
    org.springframework.faces.webflow.JsfFlowHandlerAdapter.handle(JsfFlowHandlerAdapter.java:48) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
root cause 

java.io.NotSerializableException: net.sf.ehcache.Cache 
    java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164) 
    java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) 
    java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) 
    java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
    java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
    java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) 
    java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) 
    java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
    java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
    java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) 
    java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483) 
    java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
    java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
    java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) 
    java.util.HashMap.writeObject(HashMap.java:1001) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    java.lang.reflect.Method.invoke(Method.java:597) 
    java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) 
    java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469) 
    java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
    java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
    java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) 
    java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:422) 
    org.springframework.webflow.core.collection.LocalAttributeMap.writeObject(LocalAttributeMap.java:327) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    java.lang.reflect.Method.invoke(Method.java:597) 
    java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) 
    java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469) 
    java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
    java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
    java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) 
    java.util.HashMap.writeObject(HashMap.java:1001) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    java.lang.reflect.Method.invoke(Method.java:597) 
    java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) 
    java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469) 
    java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
    java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
    java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518) 
    java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:422) 
    org.springframework.webflow.core.collection.LocalAttributeMap.writeObject(LocalAttributeMap.java:327) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    java.lang.reflect.Method.invoke(Method.java:597) 
    java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) 
    java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469) 
    java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
    java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
    java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) 
    org.springframework.webflow.engine.impl.FlowSessionImpl.writeExternal(FlowSessionImpl.java:160) 
    java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1429) 
    java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1398) 
    java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
    java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) 
    java.util.LinkedList.writeObject(LinkedList.java:943) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    java.lang.reflect.Method.invoke(Method.java:597) 
    java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) 
    java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469) 
    java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400) 
    java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
    java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) 
    org.springframework.webflow.engine.impl.FlowExecutionImpl.writeExternal(FlowExecutionImpl.java:309) 
    java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1429) 
    java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1398) 
    java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158) 
    java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330) 
    org.springframework.webflow.execution.repository.snapshot.SerializedFlowExecutionSnapshot.serialize(SerializedFlowExecutionSnapshot.java:173) 
    org.springframework.webflow.execution.repository.snapshot.SerializedFlowExecutionSnapshot.<init>(SerializedFlowExecutionSnapshot.java:70) 
    org.springframework.webflow.execution.repository.snapshot.SerializedFlowExecutionSnapshotFactory.createSnapshot(SerializedFlowExecutionSnapshotFactory.java:70) 
    org.springframework.webflow.execution.repository.snapshot.AbstractSnapshottingFlowExecutionRepository.snapshot(AbstractSnapshottingFlowExecutionRepository.java:75) 
    org.springframework.webflow.execution.repository.impl.DefaultFlowExecutionRepository.putFlowExecution(DefaultFlowExecutionRepository.java:126) 
    org.springframework.webflow.executor.FlowExecutorImpl.resumeExecution(FlowExecutorImpl.java:171) 
    org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle(FlowHandlerAdapter.java:183) 
    org.springframework.faces.webflow.JsfFlowHandlerAdapter.handle(JsfFlowHandlerAdapter.java:48) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 

ответ

2

Исключение указывает на то, что один из объектов, которые WebFlow пытается сериализовать имеет переменную экземпляра (или содержит еще один объект с переменная экземпляра) типа net.sf.ehcache.Cache, которая не является сериализуемой. Обратите внимание, что недостаточно просто отметить объект как java.io.Serializable, все его сериализованные элементы также должны быть сериализованы.

Этот вопрос описывает тест, который вы можете использовать, чтобы проверить, является ли что-то действительно сериализациями (переменные экземпляра должен быть заполнен для испытания, чтобы иметь смысл):

how to test in Java that a class implements Serializable correctly (not just is an instance of Serializable)

Из вашего определения потока, его выглядит так: com.emyed.whiteboard.controller.WhiteboardIdentifiers должен быть сериализуемым, потому что он хранится в области потока.

Из того, что я вижу, это не похоже на то, что класс «Dpwb» должен быть сериализуемым, поскольку он сохраняется только в области просмотра, что не требует сериализации.

Смежные вопросы