我正在阅读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
的破坏。两种情况都是如此?
答案 0 :(得分:1)
我在问代码,因为它可能是供应商的错误。正如您所读到的那样,如果@PostContruct时存在EjbException,则不会构建单例。之后,单例方法可以抛出任何异常(已检查或未检查),并且实例应该仍在运行。
拦截器生命周期附加到单例生命周期,因此,如果拦截器无法执行其@PostContruct,则不会创建单例。
要记住的其他事情是:如果EJB(@Stateless或@Stateful)抛出EjbException(或其拦截器),则实例会自动被丢弃,因此,规范中有一条说明: [58] Except for singletons. See Section 4.8.4