gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:52:06 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com