我有一个安装了 Liferay 6.2 的 tomcat 集群环境。每个 tomcat 都部署了许多基于 Spring 的 portlet 应用程序。我的问题是当 session 复制过程正在运行时,我得到与我的 portlet 的自定义类相关的 ClassNotFoundException。调查这个问题我发现它是由 Tomcat 核心类加载器中运行的 session 复制过程引起的,并且我保存在 session 中的自定义类被加载到自定义 portlet 类加载器中。
Oct 07, 2016 1:42:08 PM org.apache.catalina.session.StoreBase processExpires
SEVERE: Session: 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.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)
有人可以帮我解决这个问题吗?
最佳答案
如果是这种情况并且 session 复制与您的应用程序类路径完全分离,您需要将您的类(Tomcat 无法找到的类)添加到 Tomcat 的通用类加载器 (explained here)。
最好只使用 POJO 将这些类分离到单独的 jar 中。
否则,您可以将对象存储为更通用的东西(如 HashMap
)。
关于java - 在tomcat集群环境中获取ClassNotFoundException反序列化 session 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39955036/