2013-06-21 25 views
1

假設我有一個這樣的類:如何覆蓋提供給使用@EJB註釋的字段的值?

@Stateless 
@Local({ X.class }) 
public class XBean implements X { 
    @EJB // name() attribute should by spec default to "foo.XBean/y", but see below 
    private Y y; // Y is @Local 
} 

和其他地方,我有:

@Stateless 
@Local({ Y.class }) 
public class YBean implements Y {} 

@Stateless 
@Local({ Y.class }) 
public class UnwantedYBean implements Y {} 

現在我想(在XML描述符,使用XML的最小量)假設覆蓋或明確指定中y字段中的內容。

此構造(在META-INF/ejb-jar.xml文件,當然)令人驚訝的(對我來說)確實工作在GlassFish中3.1.2.2:

<ejb-jar> 
<enterprise-beans> 
    <session> 
    <ejb-name>XBean</ejb-name> 
    <ejb-local-ref> 
    <ejb-ref-name>foo.XBean/y</ejb-ref-name> 
    <ejb-link>YBean</ejb-link> 
    </ejb-local-ref> 
    </session> 
</enterprise-beans> 
</ejb-jar> 

我想關注這個問題上ejb-jar.xml片段以上,而不是任何容器bug或類似的東西。具體來說:是上面的代碼片段,它是正確的和最小的可能方式來重寫什麼EJB被注入到我的XBean.y字段中?

一些注意事項:

  • 也有人建議我需要把<injection-target>節在那裏。爲什麼會這樣?由於我使用了@EJB註釋,注射目標已經被指定。我不希望覆蓋注射發生的位置,只是注入的是什麼。

  • 該EJB規範作者自己也表示<ejb-ref-name>應該只是y而不是foo.XBean/y。儘管這是一個事實,即規範說(部分16.5.1.3):

的ejb-ref-name元素指定EJB引用名:它的值是在企業中使用的環境條目名稱豆碼 [強調我的]。

  • 沒有地方在說什麼name屬性的默認值是@EJB註釋(!),EJB規範,但我們可以推斷,它也是環境條目名稱。

    該規範給出了部分16.5.1.1一個例子:

package com.acme.example; 
@Stateless public class ExampleBean implements Example { 
    ... 
    @EJB private ShoppingCart myCart; 
    ... 
}

...這正好等於礦,然後在同一節說​​(我們」這是接近LL去發現什麼@EJBname屬性的默認值是):

企業bean參考將在引用Bean的命名上下文的名稱java:comp/env/com.acme.example.ExampleBean/myCart,其中ExampleBean是引用bean的類的名稱,並且其包裝是com.acme.example

在句子中的「命名上下文」是java:comp/env/一部分,所以一切是名字,所以安縵@EJB註釋的name屬性的默認值是classname/fieldName。我不明白這可能會如何。這也由the GlassFish EJB FAQ中的表格支持。

底線:上面引用的XML節有什麼問題?爲什麼它不會導致YBean的代理實例被注入到我的XBean@EJB -nnnated private Y y字段?

+0

您是否嘗試過使用CDI方法來停用EJB?例如。通過繼承YBean來定義@Alternative? – struberg

+0

你有沒有解決這個問題?我處於相同的情況,並且會寫入完全相同的ejb-jar.xml。它的工作原理是,如果EJB實現和ejb-jar.xml都在同一個.jar文件中,但是一旦我將它們分成兩個單獨的ejb jar並且想要選擇web應用程序中的一個實現ejb-jar.xml中。示例代碼在這裏:https://github.com/tknerr/sample-ejb-app –

+0

**更新:它現在可以工作 - 在這兩種情況下!訣竅是在後一種情況下使用EAR的application.xml **請參閱以上鍊接中的README和示例代碼 –

回答

0

1.

也有人建議我需要把<注入目標>節 在那裏。爲什麼會這樣?

我同意你的解釋,這是不必要的。我最熟悉WebSphere Application Server,其實現也同意你的解釋。

2.

EJB規範作者本人也表示, 應該是簡單的Y,不foo.XBean /年。

我不同意這種解釋並同意你的意見。

3.

有無處EJB規範,上面寫着什麼名字屬性的默認 值是@EJB註釋(!),但我們可以 推斷,它也是環境條目名稱。

EJB 3.1節16.5.2.1說:

以下規則適用於如何部署描述符條目可能 覆蓋的EJB註解:

  • 相關的部署描述符條目位於基於與註釋一起使用的JNDI 名稱(默認或明確提供 )。
+0

Right:那麼「默認」的值是什麼?我有沒有想念它? –

+0

在第16.2.2節中,具體爲「缺省情況下,字段的名稱與使用註釋的類的名稱相結合,並直接用作bean命名上下文中的名稱。」 –

+0

謝謝,正在「EJB參考」下尋找它;沒想到看起來更高。 –