我遇到了一个经典问题,即尝试在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
这似乎适用于某些课程但不是全部。
答案 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,这将无效...)