假設我有一個這樣的類:如何覆蓋提供給使用@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去發現什麼@EJB
的name
屬性的默認值是):
企業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
字段?
您是否嘗試過使用CDI方法來停用EJB?例如。通過繼承YBean來定義@Alternative? – struberg
你有沒有解決這個問題?我處於相同的情況,並且會寫入完全相同的ejb-jar.xml。它的工作原理是,如果EJB實現和ejb-jar.xml都在同一個.jar文件中,但是一旦我將它們分成兩個單獨的ejb jar並且想要選擇web應用程序中的一個實現ejb-jar.xml中。示例代碼在這裏:https://github.com/tknerr/sample-ejb-app –
**更新:它現在可以工作 - 在這兩種情況下!訣竅是在後一種情況下使用EAR的application.xml **請參閱以上鍊接中的README和示例代碼 –