无法在Websphere自由概要文件中创建EntityManagerFactory

时间:2019-04-03 17:18:33

标签: spring jpa websphere-liberty

问题描述:

我正在尝试在本地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”

2 个答案:

答案 0 :(得分:1)

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

在您的情况下,由于您需要向应用程序(以及应用程序内部的库,例如Spring / Hibernate)公开Liberty的OpenJPA类,因此可以使用Liberty的“ api type visibilty”机制来选择加入。

我猜您已经在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>

官方自由文档:Accessing third-party APIs

您可能想知道:

  

为什么Liberty在默认情况下不使third-party类(例如OpenJPA)可用?

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

答案 1 :(得分:1)

默认情况下,自由对应用程序隐藏非API类。被认为是API的东西包括Java EE,MicroProfile和其他一些东西。您可以通过配置将其开放给第三方开源api。

这样的配置:

<webApplication location="myapp.war">
  <classLoader apiTypeVisibility="+third-party" />
</webApplication>

鉴于您没有提供服务器配置示例或异常的堆栈跟踪信息,我不知道这是否可以解决您的问题,但这是基于有限信息的最佳建议。

此配置可能不适用于16.0.0.3。 +第三方支持可能是在最近才添加的(如果不替换spec,ibm-api,api,stable,third-party可以使用,但是更冗长且不易使用)。我强烈建议您升级到新版本,因为16.0.0.3不再提供功能或安全修复程序。最新版本是19.0.0.3。