以下是该方案:
目前,我们正在努力在非群集环境中运行应用程序。 但是现在我们需要将现有的应用程序部署到集群的weblogic环境中。
这是一个基于JSF的应用程序,包含许多托管bean。 现在问题是我们还没有设置任何集群环境,并且将在3周后到达。
在weblogic集群中,我相信我们一定会遇到这个问题
java.io.NotSerializableException:
我的问题是,有没有办法找出我现有的哪个类在集群环境中失败而没有在集群环境中部署。
我不确定是否有办法测试类的所有成员变量是否可序列化,以便在集群环境中不会失败。
答案 0 :(得分:0)
使用Mojarra时,您可以使用以下上下文参数来告诉它始终序列化JSF状态:
<context-param>
<param-name>com.sun.faces.serializeServerState</param-name>
<param-value>true</param-value>
</context-param>
(MyFaces等效为org.apache.myfaces.SERIALIZE_STATE_IN_SESSION
,但默认为true
在测试期间,您将获得NotSerializableException
未标记为Serializable
的实例。通常,它是视图和会话范围的bean及其所有需要可序列化的属性。
请注意,标记属性transient
不是正确的解决方案,在反序列化(恢复视图之后)后它将保持null
,这是错误的。但是在某些情况下,没有其他方法(例如第三方API),在这种情况下,您最好考虑以下解决方案之一:
将属性放在请求范围的bean中(您始终可以在其中注入视图/会话范围的bean并通过它委派所有表单操作)。
懒洋洋地加载该属性。示例:Changing request to view scope results in java.io.NotSerializableException: javax.faces.model.ListDataModel
将类包装在可序列化的类中。示例:How to make persistent Cookies with a DefaultHttpClient in Android?
对于业务服务,只要您使用EJB或CDI,就不需要将业务类标记为可序列化的。无论如何,它们都被注入了可序列化的代理。