我不确定这是否应该可行,但我正在尝试使用wildd编写一个带有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>
这应该是这样的吗?或者是野生蝇的一个错误?
答案 0 :(得分:1)
我没有直接使用Wildfly / JBoss的经验,但我和Glassfish有着相同的经历。在我们的案例中,我们使用@PersistenceContext
来注入EntityManager
,但我相信适用相同的规则。
Weld documentation有一节关于统一Java EE资源和CDI。它显示了如何定义生产者字段(更详细地描述here)以将这样的资源连接到CDI,这意味着您可以在其他地方使用@Inject
。
字段具有二元性,因为它们都可以成为Java EE组件环境注入的目标,并被声明为CDI生成器字段。因此,他们可以定义从组件环境中基于字符串的名称到类型安全注入世界中使用的类型和限定符组合的映射。我们调用一个producer字段来表示对Java EE组件环境中的对象的引用和资源。
...
资源声明确实包含两条信息: 从组件环境获取对资源的引用所需的JNDI名称,EJB链接,持久性单元名称或其他元数据,以及 我们将用于将引用注入到bean中的类型和限定符。
示例:
@Produces @Resource(lookup="java:global/env/jdbc/CustomerDatasource")
@CustomerDatabase Datasource customerDatabase;
其他地方:
@Inject @CustomerDatabase Datasource customerDatabase;
虽然在该页面上没有明确说明,但我认为包含该字段的类必须是Java EE bean,即使用其中一个EJB注释(如@javax.ejb.Stateless
或@javax.ejb.Singleton
进行注释。
答案 1 :(得分:1)
晚会,但我遇到了同样的问题。在CDI托管bean上使用@resource时,JNDI总是以“java:comp / env /”为前缀。要解决此问题,我在企业bean外使用name
时将lookup
更改为@resource
。
@Resource(lookup = "java:/ConnectionFactory")
private ConnectionFactory connectionFactory;