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/classes
和 ejb.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 { ... }
我有一个 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/classes
和 ejb.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 { ... }