简体   繁体   English

在Tomcat集群环境中获取ClassNotFoundException反序列化会话属性

[英]Getting ClassNotFoundException deserializing session attributes in tomcat clustered environment

I have a tomcat clustered environment with a Liferay 6.2 installation. 我有一个安装了Liferay 6.2的tomcat集群环境。 Each tomcat have many Spring based portlet applications deployed. 每个tomcat都部署了许多基于Spring的portlet应用程序。 My problem is when the session replication proccess is running I get ClassNotFoundException related to custom classes of my portlets. 我的问题是,当会话复制过程正在运行时,我得到与Portlet的定制类相关的ClassNotFoundException。 Investigating this problem I found that it would be caused by the session replication proccess run in Tomcat core Classloader and my custom classes saved in session are loaded in custom portlets classloaders. 研究此问题后,我发现这是由在Tomcat核心Classloader中运行的会话复制过程引起的,并且将保存在session中的自定义类加载到自定义portlet类加载器中。

Oct 07, 2016 1:42:08 PM org.apache.catalina.session.StoreBase processExpires 2016年10月7日1:42:08 PM org.apache.catalina.session.StoreBase进程到期
SEVERE: Session: EA336308A2FDB389CA636EDFC537BEB6.lfrtc1; 严重:会话:EA336308A2FDB389CA636EDFC537BEB6.lfrtc1; java.lang.ClassNotFoundException: com.pullmantur.portal.cruise.web.result.model.vo.CruiseSearchForm at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:278) at org.apache.catalina.util.CustomObjectInputStream.resolveClass(CustomObjectInputStream.java:74) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1612) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) at org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1619) at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1084) at org java.lang.ClassNotFoundException:com.pullmantur.portal.cruise.web.result.model.vo.CruiseSearchForm位于org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)位于org.apache.catalina.loader .WebappClassLoader.loadClass(WebappClassLoader.java:1571)(位于java.lang.Class.forName0(本地方法),位于java.lang.Class.forName(Class.java:278),位于org.apache.catalina.util.CustomObjectInputStream.resolveClass (CustomObjectInputStream.java:74)at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1612)at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java: 1771)在java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)在org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1619)在java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) ),位于org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1084) .apache.catalina.session.JDBCStore.load(JDBCStore.java:657) at org.apache.catalina.session.StoreBase.processExpires(StoreBase.java:157) at org.apache.catalina.session.PersistentManagerBase.processExpires(PersistentManagerBase.java:449) at org.apache.catalina.session.ManagerBase.backgroundProcess(ManagerBase.java:566) at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1352) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1546) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1556) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1556) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1524) at java.lang.Thread.run(Thread.java:745) org.apache.catalina.session.StoreBase.processExpires(StoreBase.java:157)上的.apache.catalina.session.JDBCStore.load(JDBCStore.java:657)org.apache.catalina.session.PersistentManagerBase.processExpires(PersistentManagerBase .java:449),位于org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1352),位于org.apache.catalina.session.ManagerBase.backgroundProcess(ManagerBase.java:566)。 org.apache.catalina.core.ContainerBase $ ContainerBackgroundProcessor.processChildren(ContainerBase.java:1556)处的core.ContainerBase $ ContainerBackgroundProcessor.processChildren(ContainerBase.java:1546)在org.apache.catalina.core.ContainerBase $ ContainerBackgroundProcessor.process org.apache.catalina.core.ContainerBase $ ContainerBackgroundProcessor.run(ContainerBase.java:1524)处的ContainerBase.java:1556)java.lang.Thread.run(Thread.java:745)处的ContainerBase.java:1556)

Can someone help me to fix this, please? 有人可以帮我解决这个问题吗?

If that's the case and session-replication is totally separated from your application classpath you would need to add your classes (those which couldn't be found by Tomcat) to Tomcat's Common classloader ( explained here ). 如果是这种情况,并且会话复制与您的应用程序类路径完全分开,则需要将您的类(Tomcat无法找到的类)添加到Tomcat的Common类加载器( 在此进行说明 )。

It's better to separate those classes into separate jars just with POJOs. 最好仅使用POJO将这些类分隔到单独的jar中。

Otherwise, you could store you're objects as something more general (like a HashMap ). 否则,您可以将对象存储为更通用的对象(例如HashMap )。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM