java - 在tomcat集群环境中获取ClassNotFoundException反序列化 session 属性

标签 java tomcat liferay classloader session-replication

我有一个安装了 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/

相关文章:

java - 空指针异常 | `this` 内部枚举构造函数导致 NPE

java - Hibernate 实体代理初始化

java - 为什么调用新线程在AsyncTask的doInbackground()中不起作用?

tomcat - 我们可以在tomcat中部署两个同名的war文件吗?

java - 如何从 Liferay Portlet 中删除默认消息

java - 在 Liferay 文档库中授予权限

java - 使用图形 Java 进行绘图的问题

jwebmail 启动时的 javax.servlet.unavailablexception

ssl - Liferay + glassfish 3.1.1 + CAS + SSL, liferay 出现SSL错误

session - 以分钟和秒为单位的 J2EE session 过期设置