【发布时间】:2015-12-22 11:39:49
【问题描述】:
使用带有特性的 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 功能时,没有这样的问题。
【问题讨论】:
-
如果您希望应用程序对
javax.persistence.*类具有可见性,您需要启用一些 jpa 功能。当您说您禁用了jpa-2.1时,您是否启用了jpa-2.0?这些功能应该提供 JPA 类。 -
我将
jpa-2.0作为 Maven 依赖项而不是 Websphere 功能加载。似乎因此对javax.persistence.*有部分可见性。我希望 Websphere 要么根本看不到 bean 验证代码,要么在两个地方都看到它——验证器初始化和验证本身。 -
尝试将
<feature>jpa-2.0</feature>添加到您的server.xml,这应该可以解决您的问题 -
@aguibert,如果我知道我的类路径中有两个 JPA 实现,我会感到不舒服。
-
您的类路径中是否也有 Apache BVal?通过使用 org.apache.bval.jsr.resolver.JPATraversableResolver 似乎是这样。直到最近(2015 年 6 月),BVal 甚至还没有符合 Bean Validation 1.1 的版本。我对您使用的依赖项有点困惑。也许你可以澄清一下。
标签: java classloader bean-validation websphere-liberty