【问题标题】:Websphere Liberty ClassNotFoundException during validation验证期间的 Websphere Liberty ClassNotFoundException
【发布时间】: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


【解决方案1】:

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

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

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

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

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

或者,您在 persistence.xml 中指定:

<provider>org.hibernate.ejb.HibernatePersistence</provider>

【讨论】:

  • 可能是Websphere的问题,但是我无法安装jpa-2.0功能。
  • 无法安装或无法启用? jpa-2.0 功能应包含在基本 8.5.5.7 映像中。你不应该安装任何额外的东西。
  • 由于缺少代理配置,我似乎无法安装该功能。但是你真的认为这是在 bean 验证配置和运行时完成不同类加载的 Websphere 缺陷吗?
猜你喜欢
  • 2016-05-30
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
相关资源
最近更新 更多