编辑:我将 CDI 注入(inject)点从使用 @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 注入(inject)都应该使用 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 实现会在这样的实现存在时被注入(inject)。如果在注入(inject)点指定了@Default,那么应该注入(inject)默认实现(ejb-default)。然而,这并没有发生:
// Inject the alternative implementation
@Inject
private ApplicationSettingsBeanLocal appSettingsBean;
使用此 CDI,将注入(inject)默认值,而不是替代项。这不是预期的行为。
最佳答案
beans.xml 您必须在其中指定备选方案, 必须在 ejb-default.jar 中,而不是在 ejb-client-2.jar 中。
CDI 规范(1.1,但也适用于以前的实现)在第 5.1 章指出:
An alternative is not available for injection, lookup or EL resolution to classes or JSP/JSF pages in a module unless the module is a bean archive and the alternative is explicitly selected in that bean archive.
换句话说,您必须在使用该 bean 的类的同一模块中选择替代项。
关于jakarta-ee - 如何正确使用@Alternative 实现客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12731855/