我有一个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不能工作的方式使用或者我错过了什么?
答案 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