【问题标题】:Hibernate java.lang.ClassCastException: _$$_javassist_856 cannot be cast to javassist.util.proxy.Proxy when using Websphere Shared LibraryHibernate java.lang.ClassCastException: _$$_javassist_856 在使用 Websphere Shared Library 时无法转换为 javassist.util.proxy.Proxy
【发布时间】:2016-08-01 09:45:10
【问题描述】:

Websphere 8.0.0.11

休眠 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

【问题讨论】:

    标签: java hibernate websphere websphere-8 javassist


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      问题在于 Javassist 在其生成的代码中留下了痕迹。使用类路径上的 Javassist 两次,它的类被加载两次。然而,只有当它们具有相同的名称 并且 由相同的类加载器加载时,两种类型才相等。在您的情况下,生成的类将其 Javassist 依赖解析为由您的应用程序类加载器加载的类型,而您的代码将实例转换为由 Websphere 类加载器加载的 Javassist 类型(或相反)。

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

      【讨论】:

      • 嗨拉斐尔,感谢您的回答。是的,我们正在共享 websphere 共享库中定义的许多库,以减轻我们的激烈战争。到目前为止,我们已经有了 Spring 4.x + Hibernate 3.6,一切运行顺利。 Websphere 的 Javassist 必须与我们共享库中的 Javassist 兼容。不幸的是,似乎没有一个好的解决方案......
      • 您可以做的是,您可以遮蔽您的依赖项以将其放置在不同的命名空间中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 2012-08-07
      相关资源
      最近更新 更多