Hibernate java.lang.ClassCastException:使用 Websphere 共享库时无法将 _$$_javassist_856 转换为 javassist.util.proxy.Proxy

Hibernate java.lang.ClassCastException: _$$_javassist_856 cannot be cast to javassist.util.proxy.Proxy when using Websphere Shared Library

Websphere 8.0.0.11

休眠 4.2.21.Final

我发现了很多关于同一个问题的问题,但 none 对我有用。

如果我在 Websphere 中部署应用程序,它工作正常。

但是我们已经定义了一个包含所有第三方库(spring、hibernate、javassist 等)的共享库,这样我们的 WAR 就更薄了。

通过这种方式,我们在部署期间将瘦 WAR 与 Websphere 共享库相关联。

重点是,当我们以这种方式部署应用程序时,会抛出 ClassCastException Hibernate exception _$$_javassist_856 cannot be cast to javassist.util.proxy.Proxy

我检查了 websphere 控制台中加载的 jar,在 class 路径中只能看到一个 javassist jar (3.18.1-GA)。

为什么会这样?

更新

我也尝试过使用 PARENT_FIRST 和 PARENT_LAST class 加载。

更新 2

我刚刚发现 Websphere 正在加载它自己的 javassist jar:

URL location = ProxyFactory.class.getProtectionDomain().getCodeSource().getLocation(); 
logger.info("{}", location);

它打印:file:/opt/IBM/WebSphere/AppServer/plugins/javassist.jar

问题在于 Javassist 在其生成的代码中留下了痕迹。 Javassist 在 class 路径上两次,它的 classes 被加载两次。但是,只有当它们具有相同的名称 并由相同的 class 加载程序加载时,两种类型才相等。在您的情况下,生成的 class 将其 Javassist 依赖项解析为由您的应用程序 class 加载程序加载的类型,同时您的代码将实例转换为由 Websphere [=16] 加载的 Javassist 类型=] 装载机(或者反过来)。

您是否在应用程序之间共享任何 Hibernate 依赖项?尽量不要在您的应用程序中使用任何与 Hibernate 相关的共享库以避免这种情况。

在尝试了我在 S.O 上找到的几乎所有内容之后。但没有成功,我决定 将 Hibernate 降级到 4.1 版。12.Final。这是与 Websphere 8.x.

兼容的最大 4.x 版本