【问题标题】:Hibernate Validator uses wrong Persistence ProviderHibernate Validator 使用了错误的 Persistence Provider
【发布时间】:2016-05-10 13:46:18
【问题描述】:

我们使用 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

当我们将 Bean Validation 与 validator.validate() 一起使用时,会出现以下 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。很明显,Validation Provider 使用 OpenJPA,但它应该使用 Eclipselink。

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

【问题讨论】:

  • 为什么 BeanValidation API 实现会使用任何 JPA 实现?是什么让你这么说?说它的堆栈跟踪在哪里? JPA 提供者可以使用 BeanValidation API 实现......即相反
  • 当我调用 hibernate.ValidatorImpl.validate() 时,它会返回一条错误消息:org.apache.openjpa.persistence.PersistenceProviderImpl.getProviderUtil()Ljavax/persistence/spi/ProviderUtil。这意味着,休眠验证器使用持久性提供程序。有什么想法吗?
  • 发布堆栈跟踪 .... 在您的问题中!
  • Bean Validation 很好地使用了 JPA Provider。 hibernate.atlassian.net/browse/HV-425。而且没有堆栈跟踪。
  • 用户得到一个 Throwable 并说“没有堆栈跟踪”。哈哈。调用 e.printStackTrace() 说你错了。 Java 中的所有异常都有一个堆栈跟踪。哦,好吧,因为您不想了解问题,所以您很茫然

标签: jpa weblogic bean-validation hibernate-validator


【解决方案1】:

解决方案在这里:在某些情况下,Weblogic 在类路径中具有多个持久性提供程序。在我的例子中,基于 JPA1 的 OpenJPA 和基于 JPA2 的 EclipseLink(收藏夹)。 Hibernate 验证器使用来自指定 API-Package 的 Persistence 类的逻辑来获取持久性提供程序。该实现调用该持久性提供程序上的方法,首先找到该方法 - 在我的情况下首先找到 OpenJPA。当 hibernate 验证器使用 JPA1-API 并调用基于 JPA1 的 OpenJPA 上的方法时,一切顺利。但是当它使用 JPA2-API 并调用旧 OpenJPA 上的方法时,会出现 AbstractMethodError,因为该方法是自 JPA2 以来的新方法。为了解决这个问题,我必须将 eclipselink.jar 添加到 pre-classpath。然后 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;

【讨论】:

    【解决方案2】:

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

    详情请见: http://docs.oracle.com/cd/E23943_01/web.1111/e13720/using_toplink.htm#EJBAD1311

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      相关资源
      最近更新 更多