【问题标题】:"JBAS016069: Error injecting persistence unit into CDI managed bean." When deploying WAR with dependency to EJB-JAR“JBAS016069:将持久性单元注入 CDI 托管 bean 时出错。”部署依赖于 EJB-JAR 的 WAR 时
【发布时间】:2015-03-24 19:16:33
【问题描述】:

我有以下设置:

EJB-JAR:

  • 包含一些实体和 DAO。
  • 保存 DAO 中使用的 EntityManager 的 persistence.xml。

测试战:

  • 包含注入 EJB-JAR 的 DAO 之一的 servlet(使用 @Inject 或 @EJB)。

问题:

  • 我目前正在将应用程序部署到 Wildfly 8.x
  • 当我使用在部署后启动的单例部署 jar 时,我能够按预期使用 DAO。我正在从数据库中获取结果...
  • 但是当我尝试使用设置为 jar 的依赖项(在 MANIFEST.MF 或 jboss-deployment-structure.xml 中)部署战争时,我总是收到 Weld 无法将持久性单元注入 DAO bean 的错误,因为它找不到我指定的名称的持久性单元:

    JBAS016069:将持久性单元注入 CDI 托管 bean 时出错。在部署 test.war 中找不到名为 test 的持久性单元

这是一个奇怪的错误,因为对于战争,容器不应该需要 persistence.xml 文件,因为它位于加载 dao 类的 ejb-jar 中。

那么为什么容器抱怨缺少持久性单元,尽管它存在于 jar 中?


EntityManager(ejb-jar)的注入:

public class ShopDAO {
  @PersistenceContext(unitName="test")
  private EntityManager entityManager;
...

persistence.xml (ejb-jar):

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="test">
    <properties>
      <property name="hibernate.hbm2ddl.auto" value="validate" />
      <property name="hibernate.show_sql" value="true" />
      <property name="hibernate.format_sql" value="true" />
      <property name="hibernate.generate_statistics" value="false" />
      <property name="hibernate.use_sql_comments" value="false" />
      <property name="hibernate.bytecode.use_reflection_optimizer" value="false" />
      <property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver"/>
      <property name="hibernate.connection.password" value="password"/>
      <property name="hibernate.connection.url" value="jdbc:oracle:thin:@dbms:1523:DEV11"/>
      <property name="hibernate.connection.username" value="testuser"/>
      <property name="hibernate.default_schema" value="TEST"/>
    </properties>
  </persistence-unit>
</persistence>

注入 DAO(测试战):

@WebServlet("/status")
public class TestServlet extends HttpServlet {
  @Inject
  private ShopDAO shopDAO;

  protected void doGet(HttpServletRequest rq, HttpServletResponse rp) throws ServletException, IOException {
    //do something with the shop dao!
  }
}

错误日志:

    ERROR [fail] MSC000001: Failed to start service jboss.deployment.unit."test.war".WeldStartService: org.jboss.msc.service.StartException in service jboss.deployment.unit."test.war".WeldStartService: Failed to start service
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1904)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: JBAS016069: Error injecting persistence unit into CDI managed bean. Can't find a persistence unit named test in deployment test.war
    at org.jboss.as.weld.services.bootstrap.WeldJpaInjectionServices.getScopedPUName(WeldJpaInjectionServices.java:110)
    at org.jboss.as.weld.services.bootstrap.WeldJpaInjectionServices.registerPersistenceContextInjectionPoint(WeldJpaInjectionServices.java:73)
    at org.jboss.weld.injection.ResourceInjectionFactory$PersistenceContextResourceInjectionProcessor.getResourceReferenceFactory(ResourceInjectionFactory.java:312)
    at org.jboss.weld.injection.ResourceInjectionFactory$PersistenceContextResourceInjectionProcessor.getResourceReferenceFactory(ResourceInjectionFactory.java:301)
    at org.jboss.weld.injection.ResourceInjectionFactory$ResourceInjectionProcessor.createFieldResourceInjection(ResourceInjectionFactory.java:206)
    at org.jboss.weld.injection.ResourceInjectionFactory$ResourceInjectionProcessor.createResourceInjections(ResourceInjectionFactory.java:182)
    at org.jboss.weld.injection.ResourceInjectionFactory.discoverType(ResourceInjectionFactory.java:405)
    at org.jboss.weld.injection.ResourceInjectionFactory.getResourceInjections(ResourceInjectionFactory.java:92)
    at org.jboss.weld.injection.producer.ResourceInjector.<init>(ResourceInjector.java:52)
    at org.jboss.weld.injection.producer.BeanInjectionTarget.initInjector(BeanInjectionTarget.java:55)
    at org.jboss.weld.injection.producer.BasicInjectionTarget.<init>(BasicInjectionTarget.java:68)
    at org.jboss.weld.injection.producer.BeanInjectionTarget.<init>(BeanInjectionTarget.java:49)
    at org.jboss.weld.manager.InjectionTargetFactoryImpl.chooseInjectionTarget(InjectionTargetFactoryImpl.java:126)
    at org.jboss.weld.manager.InjectionTargetFactoryImpl.createInjectionTarget(InjectionTargetFactoryImpl.java:88)
    at org.jboss.weld.bean.ManagedBean.<init>(ManagedBean.java:91)
    at org.jboss.weld.bean.ManagedBean.of(ManagedBean.java:71)
    at org.jboss.weld.bootstrap.AbstractBeanDeployer.createManagedBean(AbstractBeanDeployer.java:264)
    at org.jboss.weld.bootstrap.BeanDeployer.createClassBean(BeanDeployer.java:248)
    at org.jboss.weld.bootstrap.ConcurrentBeanDeployer$2.doWork(ConcurrentBeanDeployer.java:74)
    at org.jboss.weld.bootstrap.ConcurrentBeanDeployer$2.doWork(ConcurrentBeanDeployer.java:72)
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:60)
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:53)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    ... 3 more

【问题讨论】:

  • 您能否包括您如何使用@PersistenceContext、您的persistence.xml 和日志?
  • persistence.xml 路径是什么? world.wartest-war 是一回事,对吧?你只在这个 DAO 中使用@PersistenceContext
  • war 文件是相同的,我调整了错误日志以匹配描述的名称。 @PersistenceContext 仅在 DAO 中使用,persistence.xml 位于 ejb-jar/META-INF/ 下。如果我在这个 jar 中的另一个 bean 中使用它,DAO 也位于那里并且工作正常!
  • 我发现这种行为是由CDI引起的。如果您为带有 DAO 的 ejb-jar 启用 CDI 以便将 DAO 注入 Servlet,则只要您将 JBoss 依赖项从 war 设置到 jar,CDI 就会抱怨缺少持久性单元。问题是需要这种依赖关系才能让 DAO 在类路径上进行注入。
  • 我创建了一个Weld-Bug 看看会发生什么。类似的错误已被关闭,但我不是这样做的原因。

标签: jakarta-ee jpa wildfly


【解决方案1】:

我刚刚将文件 persistence.xml 从“...\src\main\java\META-INF”移动到“...\src\main\webapp\META-INF”它奏效了。如果类文件夹中没有 META-INF/persistence.xml 文件,则战争不起作用。

【讨论】:

    猜你喜欢
    • 2021-02-27
    • 2018-07-07
    • 2020-03-17
    • 1970-01-01
    • 2011-09-28
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    相关资源
    最近更新 更多