1

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

我正在使用 WebSphere v8.0.4.2 并通过 Rational Application Developer v8 进行开发(尽管我认为这无关紧要)。

注意:包含ABCBeanEntityManager位于 中ABC.jar,而OTHERMODULE.jar是与异常相关的代码。这些模块是一个 EAR 文件的一部分。

所以:

ABC
\__ ABCBean
\__ META-INF/persistence.xml

OTHERMODULE
\__ beans that call above bean and cannot resolve persistence unit.

调用持久性 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>

以及异常中的类:

@Stateless
@LocalBean
public class ABCBean {
    ...

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

}
4

1 回答 1

2

持久性上下文不可引用,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

之后我可以从文件中删除所有 ejb-jar persistence-context-refs,它仍然会解析引用。

于 2013-11-18T01:39:57.033 回答