spring - 无法在 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 配置的一些细节:
WLP jpa 级别:jpa-2.0
春季版:3.1.4.RELEASE
EntityManagerFactory bean: class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
jpaVendorAdapter:class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter"
事务管理器:class="org.springframework.orm.jpa.JpaTransactionManager"
解决方案
默认情况下,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
你可能想知道:
为什么 Liberty
third-party
默认不提供 OpenJPA 等类?
这是因为当一切都保持不变并且您只需升级到较新的 Liberty 版本时,Liberty 会保证零迁移。零迁移本质上意味着“升级时您不必更改任何应用程序或配置”。第三方类不受 Liberty 的直接控制,并且可能会做出破坏性的 API 更改,从而破坏零迁移。因此,Liberty 默认只公开官方/标准 API,例如 JavaEE 和 MicroProfile API。
推荐阅读
- r - 如何根据 R 中的 group_by 函数对列中的所有唯一因子求和并输出为新列?
- python - 数据框列:如果单元格包含字符串,则返回从找到字符串的索引开始的数字范围
- bootstrap-4 - 修复了被页面内容覆盖的引导导航栏
- python-3.x - 如何使用序列一个一个地遍历具有相同值的 dic 中的所有键
- nginx - nginx 返回 html 而不是 json 响应
- php - 当我在字符串开头使用表情符号时,正则表达式无法按预期工作
- sql-server - 查询不会返回数据库中的所有数据
- java - 如何在 springboot 2.2.6 中提供静态内容?
- database - 应该如何查看聊天应用的关系数据库?
- c# - 元素点击拦截异常