gpt4 book ai didi

servlets - 停止从 `ServletContextListener` 方法 `contextInitialized` 启动 Web 应用程序

转载 作者:行者123 更新时间:2023-12-02 22:05:31 24 4
gpt4 key购买 nike

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

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

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

最佳答案

不,ServletContextListener 接口(interface)的设计并不是旨在阻止 Web 应用程序的启动。

this Answer声明,Servlet 规范规定,当遇到异常时,ServletContextListener可能以某种方式禁用对 Web 应用程序的访问。 may 这个词的意思是可选的,不是必需的。该规范也没有准确定义停止访问网络应用程序的含义。

显然,各种 Web 容器中的实现行为差异很大。有些不执行任何操作,有些记录并继续,有些则阻止部署 Web 应用程序。

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

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

类似问题:

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

关于servlets - 停止从 `ServletContextListener` 方法 `contextInitialized` 启动 Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36611392/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com