Singleton EJB中的系统异常

时间:2014-02-15 19:35:05

标签: java java-ee singleton ejb

我正在阅读EJB specification并且我对我的观点中的矛盾感到困惑,特别是关于Container在生命周期回调方法中抛出System Exception时的行为方式Singleton Bean

第12.3.1节:

  

任何生命周期拦截器回调抛出的运行时异常   方法导致bean实例及其拦截器被丢弃   在拦截器链解开后和任何相关的拦截器之后   实例被丢弃(Singleton Beans除外)。

第4.8.4节:

  

Singleton初始化期间发生的错误被认为是致命的   并且必须导致丢弃Singleton实例。可能   初始化错误包括注入失败,系统异常   从PostConstruct方法抛出,或PostConstruct失败   方法容器管理的事务成功提交。

     

与其他组件类型的实例不同,抛出系统异常   从单方面的业务方法或回调不会导致   破坏Singleton实例。

那么,根据第4.8.4节的说法是什么?如果使用System Exception方法投放@PostConstruct,或Interceptor @PostConstruct方法丢弃了Bean?我试过抛出EJBException,结果是Beans初始化失败了。

更令人惊讶的是,当从EJBException 商业方法投掷Singleton Bean时,客户收到了Exception,没有其他方法可以进一步执行。我可以假设Bean实例被丢弃了吗?根据规范,不应该导致Bean Instance的破坏。两种情况都是如此?

1 个答案:

答案 0 :(得分:1)

我在问代码,因为它可能是供应商的错误。正如您所读到的那样,如果@PostContruct时存在EjbException,则不会构建单例。之后,单例方法可以抛出任何异常(已检查或未检查),并且实例应该仍在运行。

拦截器生命周期附加到单例生命周期,因此,如果拦截器无法执行其@PostContruct,则不会创建单例。

要记住的其他事情是:如果EJB(@Stateless或@Stateful)抛出EjbException(或其拦截器),则实例会自动被丢弃,因此,规范中有一条说明: [58] Except for singletons. See Section 4.8.4