我们有一个包含几个节点的Weblogic集群,我们在其中部署了一个基于JSF,Richfaces,Hibernate和Spring的Web应用程序。
应用程序似乎运行良好,但我们在日志中每2-3秒出现以下错误:
<Jun 25, 2015 6:08:14 PM CEST> <Error> <Cluster> <BEA-000126> <All session objects should be serializable to replicate. Check the objects in the session. Failed to replicate a non-serializable object.
java.rmi.MarshalException: failed to marshal update(Lweblogic.cluster.replication.ROID;ILjava.io.Serializable;Ljava.lang.Object;); nested exception is:
java.io.NotSerializableException: <Some @Service class name here>
at weblogic.rjvm.BasicOutboundRequest.marshalArgs(BasicOutboundRequest.java:92)
at weblogic.rmi.internal.BasicRemoteRef.invoke(BasicRemoteRef.java:300)
at weblogic.cluster.replication.ReplicationManager_12120_WLStub.update(Unknown Source)
at sun.reflect.GeneratedMethodAccessor773.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
我们没有在本地进行集群测试,所以我添加了一段代码来从一个控制器序列化对象,看看序列化在本地环境中是否正常:
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream outputObj;
try {
outputObj = new ObjectOutputStream(outputStream);
outputObj.writeObject(service);
outputObj.close();
outputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
service
这里是stacktrace中显示的服务类的实例,用@Autowired
注释。
我解决此问题的方法是为NotSerializableException设置断点并实现java.io.Serializable
并在调试中抱怨的所有类中添加生成的串行版本UID。由于其中有很多,我最终对所有服务(注释为@Service
)和所有存储库类(@Repository
)执行了此操作。那些课程不再抱怨了,但现在我JaxWsClientProxy
抱怨同样的。
我无法触摸此类,因为它在我的应用程序外部。此外,我在代码中找不到任何引用,所以我可以将它设置为瞬态。即使我找到任何参考文献,我也不确定这样做是否安全。
应用程序运行良好,因此我被建议可以忽略此异常。另一方面,我想知道是否应该在WS集群上复制服务/存储库类,以及正确的方法是什么。
编辑:根据@ sunrise76评论:
你可以查看以下链接吗? cxf.547215.n5.nabble.com/session-management-td549278.html。我认为 你的会话不应该是那个jar中类的类型 - sunrise76
我不确定如何使用您传递给我的信息,因此我检查了谁正在实例化此JaxWsClientProxy
类。当实例化一个名为clientPEndpoint
的bean和另一个名为clientGEndpoint
的bean时,结果是Spring。
我检查了项目,并在我们拥有Apache Camel配置的XML上找到了它:
<jaxws:client id="clientPEndpoint"
address="${ws.endPoint}"
serviceClass="<some service class>"
endpointName="s:Connector" serviceName="s:ConnectorPortType"
xmlns:s="<some namespace>">
<jaxws:outInterceptors>
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken" />
<entry key="user" value="${ws.user}" />
<entry key="passwordType" value="PasswordText" />
<entry key="passwordCallbackRef">
<ref bean="myPasswordCallback" />
</entry>
</map>
</constructor-arg>
</bean>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" id="logOut" parent="abstractLoggingInterceptor" />
</jaxws:outInterceptors>
<jaxws:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor" id="logIn" parent="abstractLoggingInterceptor" />
</jaxws:inInterceptors>
<jaxws:dataBinding>
<bean class="org.apache.cxf.jaxb.JAXBDataBinding">
<property name="extraClass">
<list>
<value><some ObjectFactory class></value>
..........
</list>
</property>
</bean>
</jaxws:dataBinding>
</jaxws:client>
<jaxws:client id="clientGEndpoint"
address="${g.ws.endPoint}"
serviceClass="<some service class>"
endpointName="s:WebServiceService" serviceName="s:WebService"
xmlns:s="<some namespace>">
<jaxws:outInterceptors>
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken" />
<entry key="user" value="${g.ws.user}" />
<entry key="passwordType" value="PasswordText" />
<entry key="passwordCallbackRef">
<ref bean="gPasswordCallback" />
</entry>
</map>
</constructor-arg>
</bean>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" id="logOut" parent="abstractLoggingInterceptor" />
</jaxws:outInterceptors>
<jaxws:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor" id="logIn" parent="abstractLoggingInterceptor" />
</jaxws:inInterceptors>
<jaxws:dataBinding>
<bean class="org.apache.cxf.jaxb.JAXBDataBinding">
<property name="extraClass">
<list>
<value><some ObjectFactory class></value>
</list>
</property>
</bean>
</jaxws:dataBinding>
</jaxws:client>
我想说这个配置让Spring创建JaxWsClientProxy
的实例,但我不完全确定。
无论如何,正如M.Deinum所说,我不确定我应该序列化服务/ DAO的实例,所以也许我应该针对一些Weblogic配置。
答案 0 :(得分:-2)
你应该检查出Serializable的Class对象(服务),并且其中的变量具有可序列化的能力,例如int可以和ImageView不能。你应该在此变量之前添加瞬态。 NotSerializableException当你想序列化一个没有被标记为Serializable的对象时抛出它。你应该用serializable实现所有类。