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 版本
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 版本