我有两个门户网站项目
PROJECT1
项目2
我有一个共享库(sharedLibrary.jar)集,它在上面的项目中使用。我的共享库用于查找dyna缓存并从中设置/获取数据。
我正在将自己的bean bean(比如com.test.UserBean)设置为来自项目1的dyna缓存。
现在从项目2开始尝试从缓存中检索bean(com.test.UserBean)。这样做时我得到classCastException。
但是当我像下面那样分配它时,它向我显示对象是com.test.UserBean
Object obj = distributedMap.get(); 我的bean实现了Serializable接口,并有一个serialVersionUID字段。
我不确定这里发生了什么。它是一个类加载器问题/其他。
任何人都可以对此有所了解吗?
答案 0 :(得分:1)
这不太可能是序列化问题,更可能是类加载器问题。
如果两个portlet Web应用程序通过单个公共类加载器真正加载了类,则可以通过DynaCache共享实例。
但是,如果使用两个不同的类加载器从同一个.jar(磁盘上)加载相同的 .class,并且这两个应用程序共享一个实例(例如,通过DynaCache分发地图)你会遇到ClassCastException
- 尽管如你所见,myInstance.getClass().getName()
会产生相同的字符串。
要确认这一点,您可以enable a service并使用WebSphere classloader viewer。这将使您,按照模块,解决您的“两个类加载器,一个类”问题。 InfoCenter文档中有一个配套文档,可引导您完成troubleshooting process。类加载器查看器将向您显示使用哪个.jar和哪个类加载器在每个模块中加载com.test.UserBean
。例如,您可能不小心将jar打包在一个而不是另一个的WEB-INF / lib中,并启用了父级最后一个类加载。