我有两个门户网站项目
项目1
项目2
我有一个共享库(sharedLibrary.jar)集,用于上述两个项目。我的共享库用于查找动态缓存并从中设置/获取数据。
我正在设置一个我自己的 bean bean(假设它是 com.test.UserBean)来从项目 1 进行动态缓存。
现在,项目 2 正在尝试从缓存中检索 bean(com.test.UserBean)。这样做时,我收到了 classCastException。
但是当我像下面这样分配它时,它向我显示该对象是 com.test.UserBean
对象 obj=distributedMap.get(); 我的 bean 实现了 Serialized 接口并具有一个 serialVersionUID 字段。
我不确定这里发生了什么。是类加载器问题还是其他问题。
任何人都可以进一步阐明这一点吗?
这不太可能是序列化问题,而更可能是类加载器问题。
如果两个 Portlet Web 应用程序确实通过单个通用类加载器加载了该类,则可以通过 DynaCache 共享实例。
但是,如果使用两个不同类加载器从同一个.jar(在磁盘上)加载相同.class,并且两个应用程序共享一个实例(例如通过DynaCache分布式映射),您将遇到
ClassCastException
-即使如您所见, myInstance.getClass().getName()
产生相同的字符串。
要确认这一点,您可以启用服务并使用WebSphere 类加载器查看器。这将使您可以针对每个模块解决“两个类加载器,一个类”问题。信息中心文档上有一个配套文档,可引导您完成故障排除过程。类加载器查看器将向您显示哪个 .jar 以及哪个类加载器用于加载每个模块中的
com.test.UserBean
。例如,您可能不小心将 jar 打包到其中一个的 WEB-INF/lib 中,而不是另一个,并且启用了父级最后类加载。