当对象保留内存和共享 class 缓存在 WebSphere7 中 100% 满时,Dozer 中的 ClassCastException

ClassCastException in Dozer when Object reserved memory and shared class cache is 100% full in WebSphere7

我们在 IBM websphere7 上的 J2EE 应用程序 运行 中使用推土机映射来映射两个 classes。我们将其用作

mapper.map(classA, Class.forName(classB));

这总是有效,除了非常非常偶尔,当它因 ClassCastException 而失败时(两年内在生产中发生一次,在测试区域中每 3 或 4 个月发生一次)。当这个异常发生时,我们会继续获取它,直到我们回收节点。 (其他节点当时可以正常工作)。在检查生成的转储时,我们注意到以下内容。

所有其他参数似乎都没问题。

我们的假设是,当源 class 和目标 class 由不同的 class 加载器加载时,会发生 ClassCastException。

这是一个正确的假设吗?如果是这样,我们如何确定它(我们有当时的堆转储和线程转储)。

还有什么会导致这样的问题?

还有什么需要注意的吗?

有什么可能的解决方案吗?

unique_ptr

的回答

这会是一个正确的假设吗? 是的,很有可能,您可以尝试在 Thread.currentThread() 之前确保 class 加载程序 conext。 setContextClassLoader(paramClassLoader);并在之后重置它。

要设置正确的 classloader,可以通过 org.dozer.util.DozerClassLoader 显式设置 dozer 的 classloader 并设置 classB.getClass().getClassLoader() 或设置 classLoader 在线程上下文中使用 mapper.getClass().getClassLoader()。 不要忘记放回原来的,否则您的应用程序会出现 CNF 异常