[英]resource injection in cdi bean
我不确定这是否应该可行,但我正在尝试使用wildfly编写一个带有cdi的JMS生成器并坚持将资源注入到cdi托管bean中:
public class CdiProducer {
@Resource(name = "java:jboss/DefaultJMSConnectionFactory")
@Produces
QueueConnectionFactory qcf;
@Resource(name = "java:/queue/HELLOWORLDMDBQueue")
@Produces
@Hello
Queue helloWordQueue;
运行这个我收到以下错误:
JBAS016076:将资源注入CDI托管bean时出错。 找不到名为的资源...
然而,非常奇怪的是,当我将资源复制并粘贴到企业bean中时,一切正常!
@Stateless
public class QueueSender {
@Resource(name="java:jboss/DefaultJMSConnectionFactory")
QueueConnectionFactory qcf;
@Resource(name="java:/queue/HELLOWORLDMDBQueue")
Queue helloWordQueue;
队列定义为:
<jms-destinations>
<jms-queue name="HelloWorldQueue">
<entry name="/queue/HELLOWORLDMDBQueue"/>
<entry name="java:jboss/exported/queue/HELLOWORLDMDBQueue"/>
</jms-queue>
</jms-destinations>
这应该是这样的吗? 或者是野生蝇的虫子?
我没有Wildfly / JBoss的直接经验,但我和Glassfish有着相同的经历。 在我们的例子中,我们使用@PersistenceContext
注入EntityManager
,但我相信适用相同的规则。
Weld文档有一节关于统一Java EE资源和CDI。 它显示了如何定义生成器字段( 此处更详细地描述)以将此类资源连接到CDI,这意味着您可以在其他地方使用@Inject
。
字段具有二元性,因为它们既可以是Java EE组件环境注入的目标,也可以声明为CDI生成器字段。 因此,他们可以定义从组件环境中基于字符串的名称到类型安全注入世界中使用的类型和限定符组合的映射。 我们将一个producer字段称为Java EE组件环境中对象的引用。
...
资源声明实际上包含两条信息:JNDI名称,EJB链接,持久性单元名称或从组件环境获取对资源的引用所需的其他元数据,以及我们将用于注入引用的类型和限定符进入我们的豆子。
例:
@Produces @Resource(lookup="java:global/env/jdbc/CustomerDatasource")
@CustomerDatabase Datasource customerDatabase;
别处:
@Inject @CustomerDatabase Datasource customerDatabase;
虽然在该页面上没有明确说明,但我认为包含该字段的类必须是Java EE bean,即使用@javax.ejb.Stateless
或@javax.ejb.Singleton
类的EJB注释进行注释。
晚了,但我遇到了同样的问题。 在CDI托管bean上使用@resource时,JNDI总是以“java:comp / env /”为前缀。 为了解决这个问题,我在企业bean之外使用@resource
时将name
更改为lookup
。
@Resource(lookup = "java:/ConnectionFactory")
private ConnectionFactory connectionFactory;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.