Java 第一次发布应用程序时,持久化单元无法注入,但在重新启动应用程序时成功

Java 第一次发布应用程序时,持久化单元无法注入,但在重新启动应用程序时成功,java,jakarta-ee,jpa,websphere,Java,Jakarta Ee,Jpa,Websphere,当我第一次用已经发布的部署应用程序启动应用程序服务器时,任何注入在特定模块中声明的持久化单元的尝试都会在声明它的bean第一次被调用时失败。我可以通过重新启动应用程序来解决这个问题,但是每次重新发布时都会出现这种情况 我正在使用WebSphereV8.0.4.2并通过RationalApplicationDeveloperV8进行开发(尽管我认为这与此无关) 注意:ABCBean包含EntityManager并驻留在ABC.jar中,OTHERMODULE.jar是与异常相关的代码。这些模块是一

当我第一次用已经发布的部署应用程序启动应用程序服务器时,任何注入在特定模块中声明的持久化单元的尝试都会在声明它的bean第一次被调用时失败。我可以通过重新启动应用程序来解决这个问题,但是每次重新发布时都会出现这种情况

我正在使用WebSphereV8.0.4.2并通过RationalApplicationDeveloperV8进行开发(尽管我认为这与此无关)

注意:
ABCBean
包含
EntityManager
并驻留在
ABC.jar
中,
OTHERMODULE.jar
是与异常相关的代码。这些模块是一个EAR文件的一部分

因此:

调用持久性bean时出现的异常是:

javax.ejb.EJBTransactionRolledbackException: nested exception is: javax.ejb.EJBException: The ABCBean/em reference of type javax.persistence.EntityManager for the ABCBean component in the XYZ.jar module of the MYAPP application cannot be resolved.
javax.ejb.EJBException: The ABCBean/em reference of type javax.persistence.EntityManager for the ABCBean component in the OTHERMODULE.jar module of the MYAPP application cannot be resolved.
    at com.ibm.wsspi.injectionengine.InjectionBinding.getInjectionObject(InjectionBinding.java:1100)
    at com.ibm.wsspi.injectionengine.InjectionBinding.getInjectableObject(InjectionBinding.java:1013)
    at com.ibm.wsspi.injectionengine.InjectionTarget.inject(InjectionTarget.java:198)
    at com.ibm.ws.injectionengine.AbstractInjectionEngine.inject(AbstractInjectionEngine.java:947)
    at com.ibm.ejs.container.StatelessBeanO.initialize(StatelessBeanO.java:300)
    at com.ibm.ejs.container.BeanOFactory.create(BeanOFactory.java:147)...
这是我的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" ...>
    <persistence-unit name="ABC_EJB">
        <jta-data-source>jdbc/***</jta-data-source>
        ...
    </persistence-unit>
</persistence>

持久性上下文不可引用到
OTHERMODULE
,因为它仅限于ABC.jar的范围。下面投票最多的答案显示了与跨EAR部署共享persistence.xml上下文相关的文档。以下是规范的摘录:

持久性单元的根必须是以下之一:

  • EJB-JAR文件
  • WAR文件的WEB-INF/classes目录[80]
  • WAR文件的WEB-INF/lib目录中的jar文件
  • EAR库目录中的jar文件
  • 应用程序客户机jar文件

在EAR级别定义的持久化单元通常对应用程序中的所有组件都可见。但是,如果相同名称的持久化单元是由EAR中的EJB-JAR、WAR或应用程序JAR文件定义的,则在EAR级别定义的该名称的持久化单元对于该EJB-JAR、WAR定义的组件将不可见,或应用程序jar文件,除非持久性单元引用使用持久性单元名称#语法来指定路径名以消除引用的歧义

我解决的项目结构如下:

APP_EAR
\__lib
    \__domain.jar
        \__META-INF
            \__persistence.xml (with <jar-file>../ABC.jar</jar-file> element because ABC module contains entity classes).
\__ABC.jar
\__OTHERMODULE.jar
APP\u EAR
\__解放党
\__domain.jar
\__META-INF
\__persistence.xml(带有../ABC.jar元素,因为ABC模块包含实体类)。
\__ABC.jar
\__OTHERMODULE.jar

之后,我可以从文件中删除所有ejb jar持久性上下文引用,它仍然可以解析引用。

为什么不只使用一个bean文件?只是说…拜托,艾拉。我们应用程序的域包含在一个jar中,并且由应用程序的其余部分依赖。OTHERMODULE作为其他JAR的全局控制器,以便能够在整个应用程序中调用代码。在beans.xml中,您必须添加,在Persistence.xml中,您必须添加WEB-INF/lib/otherModule.jar。。。希望这可以解决您的问题。为什么我需要一个beans.xml文件?我认为这是一个jsf管理的特定于bean的配置。我所拥有的bean是一个EJB,我不确定您在jsf中是如何做到的,因为我做了一些类似的事情,当我得到类似的错误wicket应用程序时,我解释了这些事情。
@Stateless
@LocalBean
public class ABCBean {
    ...

    @PersistenceContext(unitName = "ABC_EJB")
    private EntityManager em;
    ...

}
APP_EAR
\__lib
    \__domain.jar
        \__META-INF
            \__persistence.xml (with <jar-file>../ABC.jar</jar-file> element because ABC module contains entity classes).
\__ABC.jar
\__OTHERMODULE.jar