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

时间:2016-08-01 09:45:11

标签: java hibernate websphere websphere-8 javassist

Websphere 8.0.0.11

Hibernate 4.2.21.Final

我发现了很多关于同样问题的问题,但没有一个问题适合我。

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

但是我们定义了一个包含所有第三方库(spring,hibernate,javassist等)的共享库,以便我们的WAR更薄。

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

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

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

为什么会发生这种情况?

更新

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

更新2

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

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

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

2 个答案:

答案 0 :(得分:1)

在尝试了我在S.O.上发现的几乎所有东西之后没有任何成功我决定将Hibernate降级到版本4.1.12.Final 。这是与Websphere 8.x兼容的最大4.x版本。

答案 1 :(得分:0)

问题是Javassist在其生成的代码中留下了痕迹。对于类路径上的Javassist两次,它的类被加载两次。但是,如果它们具有相同的名称,则两种类型只相同由同一个类加载器加载。在您的情况下,生成的类将其Javassist依赖项解析为由应用程序类加载器加载的类型,同时您的代码将实例强制转换为由Websphere类加载器(或其他方式)加载的Javassist类型。 / p>

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