Java cdibean中的资源注入
我不确定这是否可行,但我正试图用wildfly编写一个带有cdi的JMS生产者,并致力于将资源注入到cdi管理的bean中:Java cdibean中的资源注入,java,jms,cdi,wildfly,Java,Jms,Cdi,Wildfly,我不确定这是否可行,但我正试图用wildfly编写一个带有cdi的JMS生产者,并致力于将资源注入到cdi管理的bean中: public class CdiProducer { @Resource(name = "java:jboss/DefaultJMSConnectionFactory") @Produces QueueConnectionFactory qcf; @Resource(name = "java:/queue/HELLOWORLDMDBQue
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中的一个bug?我对wildfly/JBoss没有直接的经验,但我和你对Glassfish有相同的经验。在我们的例子中,我们使用了
@PersistenceContext
来注入实体管理器
,但我相信同样的规则也适用
有一节是关于统一JavaEE资源和CDI的。它显示了如何定义生产者字段(更详细地描述)以将此类资源连接到CDI,这意味着您可以在其他地方使用@Inject
字段具有双重性,因为它们既可以是JavaEE组件环境注入的目标,也可以声明为CDI生产者字段。因此,他们可以定义从组件环境中基于字符串的名称到类型安全注入中使用的类型和限定符组合的映射。我们将表示JavaEE组件环境中对象引用的producer字段称为资源
资源声明实际上包含两条信息:
JNDI名称、EJB链接、持久化单元名称或从组件环境获取资源引用所需的其他元数据,以及
我们将用于将引用注入bean的类型和限定符
例如:
@Produces @Resource(lookup="java:global/env/jdbc/CustomerDatasource")
@CustomerDatabase Datasource customerDatabase;
其他地方:
@Inject @CustomerDatabase Datasource customerDatabase;
虽然没有在该页面上明确说明,但我相信包含该字段的类必须是JavaEEBean,即使用EJB注释之一进行注释,如
@javax.EJB.Stateless
或@javax.EJB.Singleton
我对Wildfly/JBoss没有直接的经验,但我与您对Glassfish有相同的经验。在我们的例子中,我们使用了@PersistenceContext
来注入实体管理器
,但我相信同样的规则也适用
有一节是关于统一JavaEE资源和CDI的。它显示了如何定义生产者字段(更详细地描述)以将此类资源连接到CDI,这意味着您可以在其他地方使用@Inject
字段具有双重性,因为它们既可以是JavaEE组件环境注入的目标,也可以声明为CDI生产者字段。因此,他们可以定义从组件环境中基于字符串的名称到类型安全注入中使用的类型和限定符组合的映射。我们将表示JavaEE组件环境中对象引用的producer字段称为资源
资源声明实际上包含两条信息:
JNDI名称、EJB链接、持久化单元名称或从组件环境获取资源引用所需的其他元数据,以及
我们将用于将引用注入bean的类型和限定符
例如:
@Produces @Resource(lookup="java:global/env/jdbc/CustomerDatasource")
@CustomerDatabase Datasource customerDatabase;
其他地方:
@Inject @CustomerDatabase Datasource customerDatabase;
虽然没有在该页面上明确说明,但我认为包含该字段的类必须是JavaEEbean,即使用EJB注释之一进行注释,如
@javax.EJB.Stateless
或@javax.EJB.Singleton
迟到,但我遇到了同样的问题。在CDI管理的bean上使用@resource时,JNDI总是在前面加上“java:comp/env/”。为了解决这个问题,我在企业bean外部使用@resource
时将name
更改为lookup
@Resource(lookup = "java:/ConnectionFactory")
private ConnectionFactory connectionFactory;
晚会迟到了,但我遇到了同样的问题。在CDI管理的bean上使用@resource时,JNDI总是在前面加上“java:comp/env/”。为了解决这个问题,我在企业bean外部使用
@resource
时将name
更改为lookup
@Resource(lookup = "java:/ConnectionFactory")
private ConnectionFactory connectionFactory;
你不应该使用@Resource(mappedName=“…”)@Rudi为什么?资源应该能够使用本地jndi名称?在您的问题中,您写了“JBAS016076:将资源注入CDI托管bean时出错。找不到名为…”的资源”,但是您似乎已经切断了关键部分。你能把这个关键部分包括进去吗?它是在
队列
上失败还是在连接工厂
上失败?另外,如果您使用的是WildFly 8,只需插入一个JMSContext
,就可以避免许多默认设置。@John:两者都失败了,错误消息相同,似乎与所有类型的资源一致。至于JMSContext,我很想使用,但我们正在使用wildfly进行本地开发,最终产品需要部署在WebSphere8.5上,这只是JEE6/JMS 1.1,所以没有JMSContext:(您不应该使用@Resource(mappedName=“…”)?@Rudi为什么?Resource应该能够使用本地jndi名称?在您的问题中,您写道“JBAS016076:将资源注入CDI托管bean时出错。找不到名为。。。"然而,你似乎已经切断了关键部分。你能包括这个关键部分吗?它是在队列
上失败还是在连接工厂
上失败?而且,如果你使用的是WildFly 8,你可以简单地插入一个JMSContext
,并避免许多默认值。@John:两者都失败了,带有相同的错误消息,似乎是错误的支持各种资源。至于JMSContext,我很愿意使用,但我们正在使用wildfly进行本地开发,最终产品需要部署在websphere 8.5上,该版本仅为JEE6/JMS 1.1,因此没有JMSContext:(