使用带有功能的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
功能时,没有这样的问题。
答案 0 :(得分:0)
这里的问题是在编译时通过Maven依赖提供javax.persistence.*
,但这不会延续到服务器运行时。
为了将javax.persistence.*
提供给服务器运行时,您需要在server.xml中启用jpa-2.0
或jpa-2.1
,或者您可以编写提供{{1}的用户功能}}
在您提到的评论中,您不希望在类路径上有两个JPA实现。默认情况下,javax.persistence.*
将为您提供OpenJPA实现,jpa-2.0
将为您提供EclipseLink实现。但是,您可以覆盖它,以便在运行时类路径上只有一个JPA实现。由于您使用的是Hibernate,因此您仍然可以启用jpa-2.1
或jpa-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" />