jakarta-ee - 如何正确使用@Alternative 实现客户端

标签 jakarta-ee ejb cdi ejb-3.1 qualifiers

编辑:我将 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/

相关文章:

java - EJB 不能注入(inject)其他 EJB

java - 通过使用 ejb3 和 jsf,我还需要进行 jndi 查找吗?

unit-testing - 如何测试 EJB 3.0?

testing - Arquillian 与 Mockito 和 CDI

java - 为什么 final 类不能被 CDI 代理?

Spring-boot+JPA EntityManager 注入(inject)失败

Java EE - 谁实现规范?

eclipse - 将外部 JAR 导入 Websphere Liberty? [NoClassDefFoundError]

android - Android 应用程序数据库中更新文件的通知

java - Glassfish 将字符串 "ejb"附加到特定 mobule 的 EJB 的 JNDI