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

时间:2018-12-28 09:39:43

标签: java-ee dependency-injection cdi

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

现在我还有另外两个带有EJB的WAR。

我的意图是仅使用Counter1和Counter3进行第一次WAR。另一个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>

在第二个WARs beans.xml中:

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

只要未将ICounter实现注释为@Alternative,一切都会按预期进行(显然,所有计数器均已触发)。

我用@Alternative注释ICounters时,它们根本不会被注入。无论是否通过beans.xml启用它们。

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

我是否以@Alternative不能工作的方式使用或者我错过了什么?

1 个答案:

答案 0 :(得分:0)

您的问题与$0无关,仅与bean档案和选择替代方案有关。

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

var url = (window.location != window.parent.location)
            ? document.referrer
            : document.location.href;
parent.document.location
parent.window.document.location
parent.window.location
parent.document.location.href

Instance<T>是激活替代项的地方。

现在要注意,WEB-INF/ beans.xml classes/ lib/ ejb.jar WEB-INF/beans.xml是两个截然不同的bean archives。通过WEB-INF/classes选择替代项只会影响包含该文件的Bean归档文件。

因此,就您而言,您在ejb.jar中所做的任何事情都不会对beans.xml造成影响

您可以尝试在生产者方法或派生类上使用WEB-INF/beans.xml批注选择替代项at application level

lib/ejb.jar