[英]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.