在Java EE应用程序初始化期间发生未处理异常时,是否有防止应用程序启动的方法?我基本上正在寻找一种方式,使应用程序进入“j2ee.state.failed
”状态(根据JSR-77),在从ServletContextListener
或Singleton
的Startup
bean中抛出未处理异常的情况下。
EJB规范似乎表明,如果在初始化Singleton
bean期间发生异常,则应用程序将继续启动和运行而不会出现错误;但是,只有bean本身可能处于无法调用的状态。不幸的是,这不是我想要的行为。
4.8.4 Singleton Error Handling(单例错误处理)
在Singleton初始化过程中发生的错误被视为致命错误,并必须导致Singleton实例的丢弃。可能的初始化错误包括注入失败、从
PostConstruct
方法抛出的系统异常,或容器管理事务的PostConstruct
方法无法成功提交。如果单例未能初始化,则对单例尝试的调用将导致根据第3.4.3节和第3.4.4节定义的异常。
Servlet规范在要求方面比较含糊,似乎没有“要求”容器以任何特定的方式运行,但仅仅是通过使用“可能”这个词(suggesting)来表明Web模块应该继续启动,但任何请求都应该导致内部服务器错误。不幸的是,这并不是我所期望的行为。如果无法处理任何请求,为什么Web应用程序仍然应该继续启动并且看起来正在运行呢?
11.6 Listener Exceptions
容器可以对Web应用程序的所有后续请求作出HTTP状态码500的响应,以指示应用程序错误。
根据我的经验,我发现应用服务器会以不同的方式处理这种要求。有些容器实际上会阻止应用程序在这些情况下启动,而其他容器则仅仅抑制异常并以500错误响应请求,如规范中建议的那样。
我是否忽视了规范中任何防止初始化期间发生异常时阻止应用程序启动的部分?