Weblogic JPA 2.1 Hibernate 4无法运行java.lang.NoSuchMethodError

时间:2015-01-20 17:27:21

标签: java spring hibernate jpa weblogic

我遇到了一个经典问题,即尝试在weblogic服务器上运行Web应用程序并因为weblogic服务器拥有旧的类副本而遇到错误。

我遇到的主要问题是在尝试使用JPA 2.1时遇到以下问题:

weblogic.application.ModuleException: java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;

这里显而易见的答案是它在没有该类的服务器上使用JPA版本。

我已将weblogic.xml文件设置为以下内容:     

<wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.7/weblogic-web-app.xsd">
<wls:weblogic-version>12.1.3</wls:weblogic-version>
<wls:jsp-descriptor/>
<wls:debug>true</wls:debug>
</wls:jsp-descriptor>
<wls:container-descriptor>
<wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>  
</wls:container-descriptor>
<wls:context-root>DiscoveryPortal</wls:context-root>
</wls:weblogic-web-app>

关键是:     prefer-web-inf-classes:true

这似乎适用于某些课程但不是全部。

5 个答案:

答案 0 :(得分:5)

Weblogic 12c(据说)允许在.war和.ear文件中进行类过滤。我建议搬离:

<wls:container-descriptor>
  <wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>  
</wls:container-descriptor>

为:

<prefer-application-packages> 
  <package-name>javax.persistence.*</package-name> 
</prefer-application-packages> 

<prefer-application-resources> 
  <resource-name>javax.persistence.*</resource-name> 
  <resource-name>META-INF/services/javax.servlet.ServletContainerInitializer</resource-name>
</prefer-application-resources>

过滤效果似乎比prefer-web-inf-classes好得多。

请参阅Oracle文档here,该文档说它适用于.war文件。如果没有,您可以考虑切换到.ear以查看会发生什么。

答案 1 :(得分:2)

将以下代码放入weblogic.xml

<container-descriptor>
    <prefer-application-packages>
        <package-name>javax.persistence.*</package-name> 
    </prefer-application-packages>
</container-descriptor>
如果您的类路径上有JPA 2.1 jar,那么在WebLogic Server 12.1.2.0上,

似乎足以用于相关的考虑。

答案 2 :(得分:1)

官方回答:“虽然WebLogic Server 12.1.3支持JPA 2.1,但默认情况下未配置Java Archive(JAR)文件;需要一些其他配置才能启用JPA 2.1支持。在本教程中,JPA 2.1实现是在WebLogic Server类路径上配置。“

weblogic的解决方案在这里:http://www.oracle.com/webfolder/technetwork/tutorials/obe/fmw/wls/12c/01-06-004-JavaEE7andWebLogicServer/javaee7.html

你需要添加:

PRE_CLASSPATH=/YOUR_MIDDLEWARE_HOME/oracle_common/modules/javax.persistence_2.1.jar:/YOUR_MIDDLEWARE_HOME/wlserver/modules/com.oracle.weblogic.jpa21support_1.0.0.0_2-1.jar
export PRE_CLASSPATH

到setDomainEnv.sh,它位于“bin”目录下的域文件夹中。

答案 3 :(得分:0)

所以你在CLASSPATH中有不一致的JPA API jar和Hibernate jar。 引入该方法的JPA API 2.1和Hibernate 4.3将需要支持IIRC

答案 4 :(得分:0)

我确认<wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>不适用于WebLogic12 / Spring4 / Hibernate4 / HibernateValidator5 / JPA2.1, 你必须诉诸<prefer-application-packages>,但只列出java.persistence。*远远不够......

您还必须列出:

javassist.*
org.hibernate.*
org.hibernate.validator.*
javax.validation.*

+ Class Loader分析工具将推荐您包含的任何其他工具 + 在web.xml中包含一个ServletContextListener过滤器,用于注册“HibernatePersistencerProviderResolver实现PersistenceProviderResolver”,当调用“getPersistenceProviders()”时,它将返回一个包含HibernatePersistenceProvider的单例Collection

  • 如果您使用的是Spring 在你的Spring applicationContext中支持方法验证: 你需要一个bean“验证器”class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" 还有一个 class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"

  • 您的entityManager(class =“org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean”)jpaProperties: <prop key="java.persistence.transactionType">jta</prop> <prop key="hibernate.transaction.jta.platform">org.hibernate.engine.transaction.jta.platform.internal.WebLogicJtaPlatform</prop> <prop key="hibernate.event.merge.entity_copy_observer">allow</prop>

  • 如果您正在使用maven,请在您的pom.xml中(如果使用其他构建系统,请参阅其doc进行等效设置) 你必须从依赖org.hibernate中排除org.jboss.spec.javax.transaction:jboss-transaction-api_1.1_spec :( hibernate-core和hibernate-entitymanager) 然后添加它org.jboss.spec.javax.transaction:jboss-transaction-api_1.1_spec,但作为“提供的”独立依赖项。

最后但并非最不重要...... 不要使用persistence.xml! 不仅使用LocalContainerEntityManagerFactoryBean,你不再需要它了,但它也会搞乱WebLogic,如果你需要生成DDL,你不能再使用hbm2ddl,因为hibernate maven插件不再与JPA2.1兼容,您必须使用EntityManagerFactoryBuilder.generateSchema()...(而不是在google搜索时会发现Persistence.generateSchema(...):如果没有persistence.xml,这将无效...)