簡體   English   中英

cdi bean中的資源注入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM