Hibernate Validator使用错误的持久性提供程序

时间:2016-05-10 13:46:19

标签: jpa weblogic bean-validation hibernate-validator

我们使用Oracle Weblogic Server 10.3.6。它在类路径中包含运行时OpenJPA和EclipseLink。我们使用commEnv.cmd中的以下行激活JPA2:

set PRE_CLASSPATH=BEA_HOME\modules\javax.persistence_1.1.0.0_2-0.jar;
%BEA_HOME%\modules\com.oracle.jpa2support_1.0.0.0_2-1.jar

当我们使用带有validator.validate()的Bean Validation时,会出现以下AbstractMethodError:org.apache.openjpa.persistence.PersistenceProviderImpl.getProviderUtil()Ljavax / persistence / spi / ProviderUtil;

它有效,我们配置javax.persistence_1.0.0.0_1-0-2.jar而不是javax.persistence_1.1.0.0_2-0.jar,但我们需要2.0。显然,验证提供程序使用OpenJPA,但它应该使用Eclipselink。

在开发时,我们使用Hibernate Validator。但是哪个验证提供程序使用Weblogic以及验证提供程序如何强制使用Eclipselink作为持久性提供程序?错误信息是什么意思?

2 个答案:

答案 0 :(得分:0)

解决方案:在某些情况下,Weblogic在类路径中有多个持久性提供程序。在我的例子中,OpenJPA基于JPA1,EclipseLink基于JPA2(收藏夹)。 Hibernate验证器使用来自指定API-Package的Persistence-class的逻辑来获取持久性提供程序。该实现在该持久性提供程序上调用一个方法,该方法首先被发现 - 在我的案例中首先找到OpenJPA。当hibernate验证器使用JPA1-API并在基于JPA1的OpenJPA上调用该方法时,一切进展顺利。但是当它使用JPA2-API并在旧的OpenJPA上调用方法时,就会出现AbstractMethodError,因为该方法是JPA2以来的新方法。为了解决这个问题,我不得不将eclipselink.jar添加到类前路径中。然后Eclipselink始终是第一个找到的持久性提供程序,一切进展顺利。 API和实现匹配。

set PRE_CLASSPATH=BEA_HOME\modules\javax.persistence_1.1.0.0_2-0.jar;
%BEA_HOME%\modules\com.oracle.jpa2support_1.0.0.0_2-1.jar;
%BEA_HOME%\modules\org.eclipse.persistence_1.2.0.0_2-3.jar;

答案 1 :(得分:0)

Weblogic 10.3.6中的JPA2仅作为补丁,可以手动或通过智能更新应用:

详细信息: http://docs.oracle.com/cd/E23943_01/web.1111/e13720/using_toplink.htm#EJBAD1311

这是一个补丁,因为WLS 11g不是EE6,但他们想提供JPA2