使用@Transactional,Spring 2.5和cglib部署时的AbstractMethodError

时间:2011-01-31 13:57:49

标签: spring websphere transactional cglib

希望你能帮忙解决这个问题。我使用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

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

2 个答案:

答案 0 :(得分:0)

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

另一种可能性是你错过了asm.jar,虽然在这种情况下错误可能会有所不同。

答案 1 :(得分:0)

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

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

我会打开类加载跟踪,看看这个类是从这个类中拾取的,并在其上做一个cavaj,看看它支持的方法是什么。

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

HTH Manglu