EJB Singleton服务在部署时失败

时间:2016-11-25 14:37:23

标签: java-ee-7 wildfly-9

我是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。

1 个答案:

答案 0 :(得分:1)

注射由CDI specification处理,它提供了一种“包裹”注射的功能,like so

@Inject
Instance<AnotherSingleton> anotherOneInstance;

这基本上会创建一个围绕AnotherSingleton的代理,您可以在需要时延迟获取它的实际引用。

AnotherSingleton anotherOne = anotherOneInstance.get();

这应该允许部署成功并且您的计时器初始化,但是当然如果您尝试使用anotherOne并且存储库不可用,则代码仍会因异常而中断。

或者,你总是可以做manual lookup through the BeanManager而不必依赖任何形式的依赖注入,但这应该永远是最后的手段,因为它只会导致繁琐的代码。