如何重写提供给带有@EJB注释的字段的值?
假设我有一个这样的类:如何重写提供给带有@EJB注释的字段的值?,ejb,ejb-3.1,Ejb,Ejb 3.1,假设我有一个这样的类: @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
@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)覆盖或明确指定在XBean
的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
的name
属性的默认值):
在引用bean的命名上下文中,企业bean引用的名称为java:comp/env/com.acme.example.ExampleBean/myCart
,其中ExampleBean
是引用bean的类的名称和com.acme.example
其包
这句话中的“命名上下文”是java:comp/env/
部分,因此其他所有内容都是名称,因此未经修饰的@EJB
注释的name
属性的默认值是classname/fieldName
。我不明白这是怎么回事。中的表也支持这一点
一句话:上面引用的XML节有什么问题?为什么它不会导致YBean
的代理实例被注入我的XBean
的@EJB
-带注释的私有Y
字段?<1
其他人建议我需要放一节
在那里。为什么会这样
我同意你的解释,那是没有必要的。我最熟悉WebSphereApplicationServer,它的实现也与您的解释一致
二,
EJB规范作者本人也表示
应该是y,而不是foo.XBean/y
我不同意这种解释,也同意你的解释
三,
EJB规范中没有任何地方说明默认值是什么
name属性的值用于@EJB注释(!),但我们可以
推断它也是环境条目名称
EJB3.1第16.5.2.1节说:
以下规则适用于部署描述符条目的创建方式
重写EJB注释:
- 相关的部署描述符条目基于JNDI进行定位 与注释一起使用的名称(默认或提供) 明确地)
您是否尝试过CDI方法来停用EJB?例如,通过子类化YBean定义@Alternative?您解决过这个问题吗?我也处于同样的情况下,应该编写完全相同的ejb-jar.xml。如果两个EJB实现以及EJB-jar.xml都在同一个.jar中,它就是这样工作的,但是当我将它们分成两个单独的EJB-jar并希望在web应用的EJB-jar.xml中选择一个实现时,它就会失败。这里的示例代码:UPDATE:它现在可以工作了——在这两种情况下都可以!诀窍是在后一种情况下使用EAR的application.xml,请参见右上链接中的自述和示例代码:“defaulted”的值是多少?在第16.2.2节中,特别是“默认情况下,字段的名称与使用注释的类的名称相结合,并直接用作bean的命名上下文中的名称。”;在“EJB引用”下查找它;没有想到往上看。
package com.acme.example;
@Stateless public class ExampleBean implements Example {
...
@EJB private ShoppingCart myCart;
...
}