我是JBoss和注释的新手。我有以下代码示例。不相关的细节被删除了。
@Singleton
@Startup
public class SomeBean {
@Resource
TimerService timerService;
@Inject
AnotherSingleton anotherOne;
Timer timer;
@PostConstruct
private void ejbCreate() {
timer = timerService.createIntervalTimer(0, interval, tc);
}
@Timeout
public void run() throws Exception {
}
}
@Singleton
public class AnotherSingleton {
@Inject
Repository rep;
}
有些情况是,当war在JBoss上部署时,它会失败,但Repository生产者除外(另一个Jboss中的服务不可用)。
Caused by: java.lang.IllegalStateException: WFLYEE0042: Failed to construct component instance
所以流程以
结束WFLYCTL0186: Services which failed to start: service jboss.deployment.unit."someservices-view.war".component.SomeBean.START
我有哪些选择? 我可以告诉JBoss在启动时不要@Inject bean,但是当代码由计时器执行时? 我可以以某种方式捕捉异常吗? @Schedule是不可能的,因为我需要配置Timer。
答案 0 :(得分:1)
注射由CDI specification处理,它提供了一种“包裹”注射的功能,like so。
@Inject
Instance<AnotherSingleton> anotherOneInstance;
这基本上会创建一个围绕AnotherSingleton的代理,您可以在需要时延迟获取它的实际引用。
AnotherSingleton anotherOne = anotherOneInstance.get();
这应该允许部署成功并且您的计时器初始化,但是当然如果您尝试使用anotherOne并且存储库不可用,则代码仍会因异常而中断。
或者,你总是可以做manual lookup through the BeanManager而不必依赖任何形式的依赖注入,但这应该永远是最后的手段,因为它只会导致繁琐的代码。