JavaEE:将 @Alteriative 注入 Insance<Interface>,没有默认实现

JavaEE: Inject @Alteriative to Insance<Interface> with no default implementation

我有一个 ejb-JAR 包含一些 类 计数不同的值 [Counter1, Counter2,...] 所有实现相同的接口 [ICountable]。此 JAR 的一部分是 class 循环遍历所有现有计数器并返回其值 [CounterCollector]。

现在我有另外两个 WAR,其中包含 EJB。

我的意图是让第一个 WAR 只使用 Counter1 和 Counter3。另一个 WAR 使用 Counter1 和 Counter2。 (实际情况有点复杂,但我认为这些信息足以理解这个想法)

我想在所有计数器上使用@Alternative-Annotation,并且只在 CounterCollector 中注入启用的替代项,如下所示:

...

@Inject
private Instance<ICountable> counters;

public List<Integer> getCounts()
{
    List<Integer> c = new ArrayList<>();
    for (ICountable countable : counters) {
         c.add(countable.count());
    }
    return c;
}

...

在 WAR1 中我激活了 beans.xml 中的计数器 1 和 3:

<alternatives>
  <class>Counter1</class>
  <class>Counter3</class>
</alternatives>

秒WAR秒beans.xml:

<alternatives>
  <class>Counter1</class>
  <class>Counter2</class>
</alternatives>

只要 ICounter 实现没有被注释为@Alternative,一切都会按预期工作(显然所有计数器都被触发)。

只要我用@Alternative 注释 ICounters,它们就不会被注入。无论它们是否通过 beans.xml.

启用

是否可以将@Alternative-Annotated classes 注入javax.enterprise.inject.Instance?

我是不是以一种无法正常工作的方式使用@Alternative,还是我遗漏了什么?

您的问题与 Instance<T> 无关,只是关于 bean 归档和选择替代品。

我想你的 WAR 看起来像这样:

WEB-INF/
    beans.xml
    classes/
    lib/
        ejb.jar

WEB-INF/beans.xml是您激活备选方案的地方。

现在重要的是要注意 WEB-INF/classesejb.jar 是两个不同的 bean archives。通过 beans.xml 选择替代方案只会影响包含此文件的 bean 存档。

所以在你的情况下,你在 WEB-INF/beans.xml 中所做的任何事情都不会影响 lib/ejb.jar

您可以尝试在生产者方法或派生的 类.

上使用 @Priority 注释来选择替代方案 at application level
@ApplicationScoped
@Priority(Interceptor.Priority.APPLICATION)
public class Counter1SelectedForWar extends Counter1 { ... }