升级到Hibernate 3.3.2后的java.lang.AbstractMethodError

时间:2014-02-18 21:58:08

标签: java hibernate maven jboss5.x javassist

我们有一个使用Hibernate 3.0.5的遗留应用程序,我们正在尝试将其升级到Hibernate 3.3.2(对当前代码影响较小的版本)。

更新pom.xml中的依赖项后,应用程序正确部署,但在存在延迟关联的查询中,会发生以下错误:

java.lang.AbstractMethodError: org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.setUnwrap(Z)V

依赖关系配置如下:

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>3.3.2.GA</version>
  <exclusions>
    <!-- 
      Excludes to avoid conflict with JBoss libs
      See http://stackoverflow.com/questions/3413488/saxparser-errors-with-hibernate-and-jboss-conflicting-versions
     -->
    <exclusion>
      <groupId>xml-apis</groupId>
      <artifactId>xml-apis</artifactId>
      <version>1.0.b2</version>
    </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>1.5.2</version>
</dependency>
<dependency>
  <groupId>javassist</groupId>
  <artifactId>javassist</artifactId>
  <version>3.4.GA</version>
</dependency>
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.14</version>
</dependency>

我们已经尝试切换do CGLIB而不是Javassist,但我们在等效类(org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer)上收到相同的错误。没有堆栈跟踪。下面是抛出错误时执行堆栈的图片。

Stack trace in the moment the error is thrown

该应用程序正在 JBoss 5.1.0 上运行。

有关此错误的任何提示?这可能是javassist库的错误版本吗?

EDITED

1 个答案:

答案 0 :(得分:0)

我遇到了一个与此问题非常类似的问题,结果证明它是一个JBoss Class Loader问题。 JBoss配置从一个版本快速更改到下一个版本,我建议的解决方案为我工作使用JBoss EAP 5.1.2。

到此为止。

首先,确保显式在您的POM中包含Hibernate的版本:

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>3.3.2.GA</version>
</dependency>

接下来,您需要通过在WAR文件的jboss-web.xml文件夹中包含一个名为WEB-INF的文件来覆盖JBoss的默认ClassLoader隔离(同样的方法也应该如果您正在部署EAR,请继续工作)。它的格式如下:

<jboss-web>
  <class-loading>
    <loader-repository>
        org.hibernate=my-application.war
        <loader-repository-config>java2ParentDelegation=false</loader-repository-config>
    </loader-repository>
  </class-loading>
</jboss-web>

其中my-application.war是WAR文件的名称。请注意,java2ParentDelegation设置为false可能有助于解决其他ClassLoader问题(特别是根据我的经验,使用slf4j)。

最后,JBoss 5.1.x ClassLoader问题需要处理令人抓狂,所以我希望这会有所帮助。要记住的是,问题与javassist 本身无关(您可以考虑删除POM中的显式javassist <dependency>,让Maven根据Hibernate解析它<dependency>)。这很可能是ClassLoader问题。 ClassLoading的默认JBoss策略大部分时间都可以工作,直到你得到Hibernate。 JBoss V6之前的版本与JBoss附带的Hibernate的特定版本密切相关,因此尝试使用不同版本的Hibernate而不是JBoss想要使用的版本是一个真正的痛苦。但它可以做到!

对于EAR文件,该文件名为jboss-app.xml,并且位于EAR文件的META-INF文件夹中:

<jboss-app>
  <loader-repository> 
  org.hibernate:archive=my-application.ear 
     <loader-repository-config> 
     java2ParentDelegation=false 
     </loader-repository-config> 
  </loader-repository>
</jboss-app>
祝你好运!