验证期间的Websphere Liberty ClassNotFoundException

时间:2015-12-22 11:39:50

标签: java classloader bean-validation websphere-liberty

使用带有功能的Websphere Liberty Profile 8.5.5.7

  • beanValidation-1.1已启用
  • jpa-2.1 已停用

JPA-2.0 hibernate实现虽然在项目中被加载为项目依赖项。 Validator由Spring框架自动装配,类似于

Validation.byDefaultProvider()
  .configure()
  .buildValidatorFactory()
  .getValidator()

似乎它配置了默认的可遍历解析器,它进一步将工作委托给Jpa可遍历解析器,因为我在类路径中有JPA API。但是,在对对象进行验证时,由于org.apache.bval.jsr.resolver.JPATraversableResolver:34中此类的调用使用,它会因ClassNotFoundException: javax/persistence/Persistence而失败。

似乎是与类加载器相关的WebSphere错误,但也许我应该以其他方式初始化验证?

当我在Websphere中启用jpa-2.1功能时,没有这样的问题。

1 个答案:

答案 0 :(得分:0)

这里的问题是在编译时通过Maven依赖提供javax.persistence.*,但这不会延续到服务器运行时。
为了将javax.persistence.*提供给服务器运行时,您需要在server.xml中启用jpa-2.0jpa-2.1,或者您可以编写提供{{1}的用户功能}}

在您提到的评论中,您不希望在类路径上有两个JPA实现。默认情况下,javax.persistence.*将为您提供OpenJPA实现,jpa-2.0将为您提供EclipseLink实现。但是,您可以覆盖它,以便在运行时类路径上只有一个JPA实现。由于您使用的是Hibernate,因此您仍然可以启用jpa-2.1jpa-2.0并覆盖提供程序,以便在服务器运行时只能使用一个 JPA实现。

有关如何将Hibernate设置为Liberty的JPA提供程序,请参阅此文章:
Hibernate JPA sample: Using an alternative JPA provider
它有一个示例server.xml和Web应用程序,包括源代码,应该作为一个很好的例子。

这里的关键是你在 server.xml 中指定它:

jpa-2.1

或者,您可以在 persistence.xml

中指定
<jpa defaultPersistenceProvider="org.hibernate.ejb.HibernatePersistence" />