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

时间:2016-10-10 09:19:22

标签: java tomcat liferay classloader session-replication

我有一个带有Liferay 6.2安装的tomcat集群环境。每个tomcat都部署了许多基于Spring的portlet应用程序。我的问题是当会话复制进程正在运行时,我得到与我的portlet的自定义类相关的ClassNotFoundException。调查这个问题我发现它是由Tomcat核心类加载器中运行的会话复制过程引起的,我在会话中保存的自定义类是在自定义portlet类加载器中加载的。

  

2016年10月7日下午1:42:08 org.apache.catalina.session.StoreBase processExpires
  严重:会议:EA336308A2FDB389CA636EDFC537BEB6.lfrtc1;   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)       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)       在org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1619)       at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1084)       在org.apache.catalina.session.JDBCStore.load(JDBCStore.java:657)       在org.apache.catalina.session.StoreBase.processExpires(StoreBase.java:157)       at org.apache.catalina.session.PersistentManagerBase.processExpires(PersistentManagerBase.java:449)       在org.apache.catalina.session.ManagerBase.backgroundProcess(ManagerBase.java:566)       在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)       在org.apache.catalina.core.ContainerBase $ ContainerBackgroundProcessor.run(ContainerBase.java:1524)       在java.lang.Thread.run(Thread.java:745)

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

如果是这种情况并且会话复制与应用程序类路径完全分离,则需要将类(Tomcat无法找到的类)添加到Tomcat的Common类加载器中(explained here)。

最好只使用POJO将这些类分成单独的jar。

否则,您可以将对象存储为更一般的对象(例如BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static') #STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(PROJECT_ROOT, 'staticfiles'), ) STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage' STATIC_URL = '/static/' )。