【发布时间】:2015-09-13 14:05:25
【问题描述】:
我已经在解决将 bean 实现注入 javax.enterprise.inject.Instance<SomeIFace> 的问题了。我有几个 bean (EJB Singletons),它们扩展了一个实现 SomeIFace 的抽象类 - 请参见下面的场景。
public interface SomeIFace {
void doStuff();
}
那么就有一个采用SomeIFace的抽象类如下:
public abstract class SomeAClass implements SomeIFace {
@Resource
private TimerService ts;
public TimerService getTimerService() {
return ts;
}
@Timeout
public void timeout() {
doStuff();
}
}
托管bean的实际实现扩展抽象类SomeAClass如下:
@Singleton
@Startup
@TransactionManagement(TransactionManagementType.BEAN)
public class SomeClass extends SomeAClass {
/**
* {@inheritDoc}
*/
@Override
public void doStuff() {
...
}
}
然后在另一个类中,我想获取对所有实现SomeIFace 的托管 bean 的引用,即:
@Inject
@Any
private Instance<SomeIFace> beans;
问题是beans 是空的!
当我再次将SomeIFace 显式添加到实现bean 类(即public class SomeClass extends SomeAClass implements SomeIFace)时,beans 不为空并出现引用。
有谁能解释一下,为什么我需要在 bean 实现上直接重复 SomeIFace 接口以使 CDI 1.2 正常工作?在以前版本的 CDI 中,它工作正常。
提前谢谢你!
吉日
更新:
这个奇怪的注入问题只发生在 EJB Singletons (@javax.ejb.Singleton) 的 bean 上。当 bean 使用 @javax.inject.Singleton 或 @javax.enterprise.context.ApplicationScoped 注释时,不需要重复接口声明,并且可以发现 bean。但是,TimerService 不能注入到非 EJB bean 中
【问题讨论】:
-
嗯听起来不太对劲。所有这些都在同一个WAR中吗?这里涉及到任何 JAR 文件吗?
-
是的,都在同一个WAR中,实际上在同一个JAR文件中
-
它也发生在 Glassfish,并且发生在任何 EJB(单音或无状态)上,在我的测试期间我能够注入 Instance
bean,但是一旦我引入一个接口来定义一个本地查看,该 bean 不再出现在 bean 列表中 @Inject Instance beans。解决此问题的一种方法是直接使用接口显式标记 EJB 实现。
标签: jakarta-ee dependency-injection ejb cdi wildfly