【问题标题】:Stop launch of web app from `ServletContextListener` method `contextInitialized` [duplicate]停止从`ServletContextListener`方法`contextInitialized`启动Web应用程序[重复]
【发布时间】:2016-08-05 07:35:07
【问题描述】:

我通过@WebListener 注释在Java Servlet 网络应用程序中实现了ServletContextListener。在我的contextInitialized 方法中,我做了一些设置工作并验证预期的资源是否可用。

如果我在 contextInitialized 方法中确定有问题,我该如何阻止 Web 应用程序继续执行 servlet?如果环境不合适(例如没有可用的数据库),则不应执行这些 servlet。

如何优雅地处理基于 servlet 的 Web 应用程序的故障环境?

【问题讨论】:

  • 您是否尝试抛出异常?

标签: servlets production-environment java-ee-7


【解决方案1】:

不,ServletContextListener 界面似乎不是为了阻止网络应用程序的启动而设计的。

正如this Answer 所说,Servlet 规范说ServletContextListener 可能在遇到异常时会以某种方式禁用对 Web 应用程序的访问。那个词may 表示可选的,不是必需的。该规范也没有准确定义停止访问 Web 应用程序的含义。

显然,在各种 Web 容器中实现的行为差异很大。有些什么都不做,有些登录并继续,有些阻止 Web 应用程序的部署。

我对 Tomcat 8.0.33 的体验... 将 throw new RuntimeException ( "bogus stop servlet " ); 放入 contextInitialized 方法会阻止应用程序被部署。 IDE 报告中部署期间的控制台报告“FAIL - 已在上下文路径部署应用程序/但上下文无法启动”。不幸的是,该控制台和任何日志都没有捕获实际异常的报告。因此,如果您从一个或多个侦听器中抛出多个异常,调试将不明显。

正如 Stack Overflow 其他地方所提到的,最可靠的解决方案可能是让您的 ServletContextListener 使用存储在 servlet 会话中的标志变量来标记成功或失败。然后让您的 servlet 代码检索并检查该标志。然后,您的 servlet 代码将确定适当的操作过程。您的 Web 应用程序将被部署,但您自己的 servlet 可以选择不执行任何操作并返回一些 HTTP 错误代码。

类似问题:

旁注:添加或编辑您的ServletContextListener 时,您可能需要对您的项目执行“清理并构建”操作。您的 IDE 的热插拔或开发时部署功能可能无法在新的或更改的侦听器上使用。跟踪您的代码或进行一些日志记录以进行验证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    相关资源
    最近更新 更多