【问题标题】:AbstractMethodError on deploy with @Transactional, Spring 2.5 and cglib使用 @Transactional、Spring 2.5 和 cglib 部署时的 AbstractMethodError
【发布时间】:2023-03-12 13:40:02
【问题描述】:

希望您能对此有所帮助。我正在使用 Spring @Transactional 注释来标记方法事务,并且我有必要的 <tx:annotation-driven transaction-manager="txManager"/>。我的构建中包含 Spring 2.5.6 和 cglib 2.1_3。

在部署时(到 Websphere 7 运行时),我看到 bean 创建异常,根本原因是:

Caused by: java.lang.AbstractMethodError: net/sf/cglib/core/ClassGenerator.generateClass(Lnet/sf/cglib/asm/ClassVisitor;)V
    at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
    at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
    at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
...and so on

我认为这意味着我们在AbstractClassGenerator 的一个实例上调用generateClass(...) 方法,它没有实现该方法。由于所有这些东西似乎都是在 Spring 中透明设置的,但我不确定从这里去哪里解决问题……有什么想法吗?

【问题讨论】:

    标签: spring websphere transactional cglib


    【解决方案1】:

    我猜你有多个 cglib 的副本。您的应用服务器是否有自己的副本?如果是这样,您最好不要将其也包含在您的应用程序中。

    另一种可能性是您缺少asm.jar,尽管在这种情况下错误可能会说明不同的内容。

    【讨论】:

    • 我将检查应用服务器上的其他副本...我在要调用的类上方添加了一个接口(我没有为其创建接口的 ONE 类...)和切换配置以使用具体的子类,一切都开始了。不知道为什么
    • @Brabster:由于一些令人费解的设计选择,cglib 在类加载方面通常令人不快。同样令人费解的是为什么 Spring 的人们坚持使用它。
    【解决方案2】:

    按照 Skaffman 的建议,检查是否存在 cglib 的重复副本。我手边没有 WAS 7,但我查看了构建在 WAS 7 之上的 WPS 7,并注意到有一个 JAR - cglib-nodep-2.1_3.jar,它是 SCA 功能包的一部分.

    您的机器上是否有 SCA 功能包,并查看该文件是否存在。

    我会打开类加载跟踪来查看这个类是从哪个 Jar 中提取的,并对其进行 cavaj 以查看它支持哪些方法。

    当你说具体的子类似乎解决了这个问题时,它也打败了我!如上所述,我会首先找到在运行时加载这些类的 Jar,然后弄清楚发生了什么。

    HTH 芒露

    【讨论】:

      猜你喜欢
      • 2014-03-23
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      • 1970-01-01
      • 2015-01-19
      • 1970-01-01
      • 2013-02-13
      相关资源
      最近更新 更多