首页 > 解决方案 > 无法在 websphere 自由配置文件中创建 EntityManagerFactory

问题描述

问题描述:

我正在尝试在本地 Eclipse 环境下将 Web 应用程序从 Websphere 8.5.5 迁移到 Websphere Liberty Profile (WLP 16.0.0.3)。该应用程序在 Websphere 中运行良好,但在 WLP 中启动时出现以下异常:

创建名为“entityManagerFactory”的bean时出错:FactoryBean对象的后处理失败;嵌套异常是java.lang.NoClassDefFoundError: org.apache.openjpa.persistence.query.QueryBuilder

我希望QueryBuilder类出现在 Liberty 运行时提供的 opnJPA 实现中,但由于某种原因未正确加载。任何帮助将不胜感激。

关于 jpa 配置的一些细节:

标签: springjpawebsphere-liberty

解决方案


默认情况下,jpa-2.0 功能仅向应用程序公开规范标准的 JPA 包。它不会公开开箱即用的 JPA 实现特定类。

在您的情况下,由于您需要将 Liberty 的 OpenJPA 类公开给您的应用程序(以及您的应用程序中的库,例如 Spring/Hibernate),您可以通过使用 Liberty 的“api 类型可见性”机制来选择加入。

我猜你的应用程序在 server.xml 中配置了这样的东西:

<application location="myApp.war"/>

要允许您的应用程序查看第三方(例如 OpenJPA)类,您可以这样做:

<application location="myApp.war">
  <!-- spec, ibm-api, and stable are enabled by default. -->
  <!-- Add third-party to get access to OpenJPA classes from your application -->
  <classloader apiTypeVisibility="spec, ibm-api, stable, third-party"/>
</application>

官方 Liberty 文档:访问第三方 API

你可能想知道:

为什么 Libertythird-party默认不提供 OpenJPA 等类?

这是因为当一切都保持不变并且您只需升级到较新的 Liberty 版本时,Liberty 会保证零迁移。零迁移本质上意味着“升级时您不必更改任何应用程序或配置”。第三方类不受 Liberty 的直接控制,并且可能会做出破坏性的 API 更改,从而破坏零迁移。因此,Liberty 默认只公开官方/标准 API,例如 JavaEE 和 MicroProfile API。


推荐阅读