关于 EJB 和资源注入的问题

Posted

技术标签:

【中文标题】关于 EJB 和资源注入的问题【英文标题】:question on EJB and resource injection 【发布时间】:2010-10-27 07:55:01 【问题描述】:

我在让 JBoss 将环境变量值注入 bean 时遇到问题。这是我的 bean 类:

包 com.topcoder.test; 导入 java.util.ArrayList; 导入 java.util.List; 导入 javax.annotation.Resource; 导入 javax.ejb.EJBContext; 导入javax.ejb.Remote; 导入 javax.ejb.SessionContext; 导入 javax.ejb.Stateless; 导入 javax.ejb.TransactionManagement; 导入 javax.ejb.TransactionManagementType; 导入 javax.naming.Context; 导入 javax.naming.InitialContext; 导入 javax.naming.NamingException; 导入 javax.persistence.EntityManager; 导入 javax.persistence.PersistenceContext; 导入 javax.persistence.PersistenceContextType; 导入 org.jboss.annotation.ejb.RemoteBinding; 导入 com.topcoder.test.Test; 公共@Stateless(名称=“TestBean”) 类TestBean实现测试 @Resource(name="managerFile") 私有字符串管理器文件; 公共字符串 getManagerFile() 返回管理器文件; 公共字符串测试方法() String ret = "testMethod()中managerFile的值为" + getManagerFile(); 返回 ret; @PersistenceContext(unitName = "persistenceUnit", type = PersistenceContextType.TRANSACTION) 私人 EntityManager 经理; @PersistenceContext(unitName = "persistenceUnit", type = PersistenceContextType.TRANSACTION) 公共无效 setEntityManager(EntityManager 管理器) this.manager = 经理; 公共实体管理器 getEntityManager() 如果(经理==空) throw new IllegalStateException("EntityManager 在使用前没有在 DAO 上设置"); 退货经理; @SuppressWarnings("未选中") 公共列表retrieveAll()抛出异常 实体管理器 em = getEntityManager(); 列表结果 = em.createQuery("FROM TestEntity").getResultList(); 如果(结果==空) 结果 = 新的 ArrayList(); 返回结果;

我希望 JBoss 注入 managerFile 值。这是我的 ejb-jar.xml:

<enterprise-beans>
    <session>
        <ejb-name>Test</ejb-name>
        <ejb-class>com.topcoder.test.TestBean</ejb-class>
        <env-entry>
            <env-entry-name>managerFile</env-entry-name>
            <env-entry-type>java.lang.String</env-entry-type>
            <env-entry-value>com/topcoder/test/TestBean.properties</env-entry-value>
        </env-entry>
    </session>
</enterprise-beans>

但是当我将耳朵部署到 JBoss 时收到此错误消息:

09:07:40,495 WARN [ResourceHandler] 未注入 managerFile,未找到匹配的 enc 注入器 env/managerFile

我正在运行 JBoss 4.2。我做错了什么?

【问题讨论】:

【参考方案1】:

确保 ejb-jar.xml 位于您的 EJB 所在 JAR 的 META-INF/ 中,而不是 EAR 的 META-INF。

与您的问题无关,您可以删除:

@PersistenceContext

来自您的 setEntityManager() 方法(您不需要同时注释它和 entityManager 字段)

【讨论】:

感谢您的回答。我将 @Stateless 注释上的 Test 更改为 TestBean ,但我仍然得到相同的错误:[ResourceHandler] Not injection managerFile, no matching enc injectionor env/managerFile found 还有其他想法吗? 您确定 ejb-jar.xml 文件在您的 JAR 的 META-INF/ 目录中吗?如果我没有包含 我会收到同样的错误,所以您的问题可能是部署问题 我有一个部署到 JBoss 的 ear 目录,在那个 ear 文件夹下我有一个 META-INF 文件夹。 ejb-jar.xml 在那个 META-INF 文件夹中。 你的无状态会话bean是如何打包的? ejb-jar.xml 需要在包含该代码的 jar 的 META-INF/ 目录中,而不是耳朵的 MET-INF。 就是这样!非常感谢。一旦我将 ejb-jar.xml 放入 ejb 代码的 jar 的 META-INF 中,它就起作用了。我假设 application.xml 和 jboss-app.xml 需要留在耳朵的 META-INF 文件夹中,对吧?这就是我目前拥有的方式。再次感谢!

以上是关于关于 EJB 和资源注入的问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 RESTeasy 和 JBoss 的外部 @EJB 注入返回 null

在其他模块的 JSF ManagedBean 中通过 @EJB(lookup) 注入远程无状态 EJB

JSF 托管 bean EJB 注入

迁移到 JBOSS 7.4 和 Java11 后未正确注入 EJB 无状态 bean

关于EJB--实体Bean的BMP和CMP选择

无法在无状态 EJB 中注入 JMS 队列