WebSphere DynaCache 反序列化问题

问题描述 投票:0回答:1

我有两个门户网站项目

项目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 字段。

我不确定这里发生了什么。是类加载器问题还是其他问题。

任何人都可以进一步阐明这一点吗?

java jakarta-ee websphere websphere-portal dynacache
1个回答
1
投票

这不太可能是序列化问题,而更可能是类加载器问题。

如果两个 Portlet Web 应用程序确实通过单个通用类加载器加载了该类,则可以通过 DynaCache 共享实例。

但是,如果使用两个不同类加载器从同一个.jar(在磁盘上)加载相同.class,并且两个应用程序共享一个实例(例如通过DynaCache分布式映射),您将遇到

ClassCastException
-即使如您所见,
myInstance.getClass().getName()
产生相同的字符串。

要确认这一点,您可以启用服务并使用WebSphere 类加载器查看器。这将使您可以针对每个模块解决“两个类加载器,一个类”问题。信息中心文档上有一个配套文档,可引导您完成故障排除过程。类加载器查看器将向您显示哪个 .jar 以及哪个类加载器用于加载每个模块中的

com.test.UserBean
。例如,您可能不小心将 jar 打包到其中一个的 WEB-INF/lib 中,而不是另一个,并且启用了父级最后类加载。

© www.soinside.com 2019 - 2024. All rights reserved.