当前位置: 首页 > 知识库问答 >
问题:

“JBAS016069:将持久性单元注入CDI托管bean时出错。”

燕扬
2023-03-14

我有以下设置:

EJB-JAR:

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

测试-战争:

  • 包含一个servlet,它注入EJB-JAR的DAO之一(使用@inject或@ejb)。

问题是:

>

  • 我当前正在将应用程序部署到Wildfly 8.x
  • 当我用一个在部署后启动的单例来部署jar时,我就能够按照预期使用DAOs。我正在从数据库得到结果...
  • 但是当我试图部署war并将依赖项设置到jar(在manifest.mf或jboss-deployment-structure.xml中)时,我总是得到这样的错误:Weld无法将持久性单元注入到DAO bean中,因为它找不到具有我指定名称的持久性单元:

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

    这是一个奇怪的错误,因为对于war,容器不应该需要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
    
  • 共有1个答案

    邴俊达
    2023-03-14

    我只是将文件persistence.xml从“...\src\main\\meta-inf”移动到“...\src\main\webapp\meta-inf”,结果起作用了。如果类文件夹中没有meta-inf/persistence.xml文件,则war将不起作用。

     类似资料:
    • 我正计划将一个web应用程序从使用JSF托管bean转换为使用CDI托管bean。我知道我需要做以下工作: 在WEB-INF中添加空beans.xml文件。 将所有JSF@ManagedBean替换为CDI@Named Annotations。 用CDI或OmniFaces作用域注释替换所有JSF作用域注释。 将所有JSF@ManagedProperty替换为CDI@Inject Annotati

    • 我有一个完全工作的Spring 4 Hibernate应用程序。Hibernate通过<代码> 我知道我可以定义一个像这样的bean,但不知道如何配置它。(我也不想重复配置。) MyTest.java test-context.xml 持久性.xml

    • 我有一个JSF的问题,CDI项目。我做了大量研究,发现在CDI中没有注释。我用对话框解决基于ajax的页面的问题。我想将变量从DataTable传递到dialog。为此,我不能使用bean,因为在请求结束后会丢弃值。有人能帮我解决吗?我不能使用,但这是一个糟糕的做法。或者只保存这一个变量到会话谁知道。你们能给我一些提示如何优雅地解决这个问题吗? 以下是错误消息:

    • 在我正在构建的应用程序中,我们使用直Java6 EE和JBoss(没有Spring等),以及JPA/Hibernate、JSF、CDI和EJB。 我还没有找到很多好的通用安全解决方案(欢迎推荐),但我找到的最佳选择是ApacheShiro。 然而,这似乎有一些缺点。您可以在Balus C的网站上阅读其中一些内容: http://balusc.blogspot.com/2013/01/apache-

    • 我想从方法中检索注释(自定义编写的注释)。通常我可以通过访问 但是如果bean由CDI容器管理(我使用的是OpenWebBeans),那么类在运行时会得到增强。然后我必须使用超类来请求注释。目前,我试图通过在类名中查找“$$”来检测是否管理该类。但对我来说,这似乎是一个非常肮脏的解决方案。 有什么好方法可以从CDI管理的bean中检索注释吗? 详细地说,我的代码是这样的:我创建了一个注释“Cool

    • 主要内容:实例,运行测试结果以下代码显示了如何进行bean注入。 我们先定义一个消息bean,它有一个字符串属性来存储消息。 然后我们再定义另一个托管bean,并使用注解注入。 实例 打开 NetBean8.2,创建一个名为: InjectManagedBeans 的工程,并加入以下文件代码。 以下是文件:UserBean.java 中的代码 - 以下是是文件:index.xhtml 中的代码 - 以下是文件:Message