【发布时间】:2012-09-25 18:14:28
【问题描述】:
编辑:我将 CDI 注入点从使用 @EJB 更改为使用 @Inject,如下面的 cmets 所示。仅供参考。
我有两个 EAR 项目,两者基本相同。他们唯一的区别是一些客户特定的实现,如果需要的话。但是,我遇到了问题。
这就是我所拥有的:
EAR #1 包含以下模块:
web.war
ejb-default.jar
ejb-client-1.jar
EAR #2 包含以下模块:
web.war
ejb-default.jar
ejb-client-2.jar
在ejb-default中包含以下内容:
@Singleton
@Startup
public class ApplicationSettingsBean implements ApplicationSettingsBeanLocal
现在,对于 EAR #1,ejb-client-1.jar 可能为空,因此任何 EJB 注入都应使用 ejb-default 中的任何内容。
但是,对于 EAR #2,我想用特定于客户端的实现来覆盖默认实现。例如:
@Singleton
@Startup
@Alternative
public class ApplicationSettingsBean implements ApplicationSettingsBeanLocal {
我还在 ejb-client-2 中创建了以下 beans.xml 条目:
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<alternatives>
<class>com.client2.ejb.ApplicationSettingsBean</class>
</alternatives>
</beans>
我希望@Alternative 实现会在这样的实现存在时被注入。如果在注入点指定了@Default,则应该注入默认实现(ejb-default)。不过,这不会发生:
// Inject the alternative implementation
@Inject
private ApplicationSettingsBeanLocal appSettingsBean;
使用此 CDI,注入的是默认值,而不是替代方法。这不是预期的行为。
【问题讨论】:
-
因此,按照 Gavin King 在另一个论坛上的建议,我将所有注入点从使用
@EJB更改为@Inject,从而消除了错误。但是,它并没有解决问题。现在,@Alternative 实现被忽略,取而代之的是@Default(隐含注释)实现。我在第二个 EJB jar 中仔细检查了 beans.xml,它看起来不错。 -
以上代码已更改以反映问题。
标签: jakarta-ee ejb cdi ejb-3.1 qualifiers