结合特性使用Websphere with 8.5.5.7
beanValidation-1.1已启用jpa-2.1 禁用JPA-2.0Hibernate实现正在作为项目依赖项加载,尽管在项目中如此。验证器由Spring框架自动生成,类似于
Validation.byDefaultProvider()
.configure()
.buildValidatorFactory()
.getValidator()似乎它配置了默认的可遍历解析器,这进一步将工作委托给Jpa可遍历解析器,因为我在类路径中有JPA。但是,当对一个对象进行验证时,由于在ClassNotFoundException: javax/persistence/Persistence中调用这个类的用法,它在org.apache.bval.jsr.resolver.JPATraversableResolver:34中会失败。
似乎是与类加载器相关的WebSphere错误,但也许我应该以其他方式初始化验证?
但是,当我在Websphere中启用jpa-2.1特性时,就没有这样的问题了。
发布于 2015-12-22 16:14:30
这里的问题是,javax.persistence.*是在编译时通过Maven依赖项提供的,但是这不会传递到服务器运行时。
为了将javax.persistence.*提供给服务器运行时,您需要在server.xml中启用jpa-2.0或jpa-2.1,或者可以编写提供javax.persistence.*的用户特性。
在您提到的注释中,您不希望在类路径上有两个JPA实现。默认情况下,jpa-2.0将为您提供一个OpenJPA实现,而jpa-2.1将为您提供一个EclipseLink实现。但是,您可以重写它,因此运行时类路径上只有一个JPA实现。由于您正在使用Hibernate,所以仍然可以启用jpa-2.0或jpa-2.1并覆盖提供程序,以便在服务器运行时只有一个JPA实现可用。
有关如何将Hibernate设置为自由的JPA提供程序,请参阅本文:
它有一个示例server.xml和web应用程序,包括源代码,可以作为一个很好的例子。
这里的关键是在server.xml中指定这一点。
<jpa defaultPersistenceProvider="org.hibernate.ejb.HibernatePersistence" />或者,您可以在persistence.xml中指定此
<provider>org.hibernate.ejb.HibernatePersistence</provider>https://stackoverflow.com/questions/34415105
复制相似问题