如何重写提供给带有@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;
  ...
}