编辑:我将 CDI 注入点从使用 @EJB 更改为使用 @Inject,如下面的评论所示。仅供参考。
我有两个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,将注入默认值,而不是替代方案。这不是预期的行为。