java - 处理 Java Web 应用程序启动错误的正确方法

标签 java servlets error-handling war

我目前正在编写一个在启动时执行特定检查的 Java Web 应用程序。例如,检查配置文件是否存在并定义所有必需的设置变量。

我将检查代码放在 ServletContextListener 类的子类中,并使用以下方法在 web.xml 中注册了 ServletContextListener 子类:

<listener>
    <listener-class>com.bloxware.lls3.MainContextListener</listener-class>
</listener>

在覆盖的 contextInitialized() 方法中,我编写了代码来检查配置文件是否就位并包含有效值。

如果在启动时发生错误,我想记录这个错误并以适当的方式通知网络用户。

我需要帮助如何从这里继续前进:

  1. 我是否在正确的位置(在 ServletContextListener.contextInitialized(..) 方法内)读取配置文件参数?

  2. 一旦发生这种情况,我将如何处理向用户显示错误页面(例如,我应该向每个 servlet 和 jsp 页面添加代码以检查全局标志,还是我可以以更智能的方式执行此操作,可能是 ServletRequestListener.requestInitialized(..))?

  3. 我需要一种方法,如果用户修复了配置文件,刷新页面就足够了,不需要重新启动 Web 应用程序。

最佳答案

我可以尊重拥有 self 检查的动态配置的目标,但实际上我不建议走这条路。

在大多数情况下(稍后注意),当 Web 应用程序启动时,它要么配置正确,要么配置不正确。如果应用程序配置错误,它根本无法工作。例如,当应用程序启动时,许多应用程序将连接到数据库。如果他们的连接字符串错误,就永远不会有良好的用户体验。这应该在启动时处理,并且启动。 Web 应用程序不应启动,如果它知道它无法运行。在整个应用程序中散布代码来处理这个问题不是正确的方法。

在上下文初始化时检查它的想法很好。但是,它应该非常愿意当场抛出一个详细的和记录的异常,以便管理员(而不是用户!)可以处理这个问题并重新启动应用程序。

至于无需重启即可更新的动态配置。这适用于调整非关键参数,例如超时长度、日志记录级别或池设置。如果它们不正确,这些应该只是不会使应用程序立即停止的东西。您的数据库连接的主机名(例如)不是其中之一。

根据我的经验,这些事情都不值得为处理动态重新加载配置引起的所有附带问题而付出努力。我会在启动时检查一切,如果出现致命问题则立即停止。

编辑:旁注 - 检查您的配置文件是否就位并包含所有必要的设置可能应该在测试中完成,而不是在应用程序启动时完成。您可以将此作为针对文件本身的简单单元测试来执行。

关于java - 处理 Java Web 应用程序启动错误的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4767481/

相关文章:

JIT/预热时的 java.util.EmptyStackException

java - 尝试从图像中读取像素时出现 ArrayIndexOutOf BoundsException

java - 对于具有弱 HashMap 的重复数据删除器,正确的实现是什么?

java - 在 Swagger 中为请求参数提供示例值

java - Servlet 需要访问嵌入在 war 文件中的 SQLite DB

java - 如何向我的 Java Servlet 的现有 HttpServletRequest 添加参数?

java - 将我的 jsp 表单重定向到成功页面

c++ - 写入大于2Gb的文件

Java 错误页面配置

java - 如何监控在浏览器中运行的Java Applet 的错误日志?