【问题标题】:Stop Servlet context from initializing in init method停止 Servlet 上下文在 init 方法中初始化
【发布时间】:2014-06-19 07:40:18
【问题描述】:

我有一个 servlet,它在服务器启动时加载 <load-on-startup>1</load-on-startup>,在 servlet 的 init() 方法中,我正在从属性文件中检查一些参数。如果参数不存在,我想阻止整个上下文初始化。

public void init(){
   Readproperty pr = new ReadProperty();
     if(!pr.parameterExists()){
     //Edit: 
     throw new UnavailableException("Testing Stopping Context")

    }
}

最好的方法是什么?我现在确实想将此代码移动到我的上下文侦听器类中,因此我正在寻找从 `init()' 方法中执行此操作的最佳方法。

【问题讨论】:

  • 您可以抛出 RuntimeException,例如 IllegalStateException。
  • 我也想过这个,但无法分析与javax.servlet.UnavailableException的含义或差异。有没有办法调用上下文销毁?
  • 嗯,你是对的,init() 被允许抛出一个 ServletException,所以最好抛出一个 UnavailableException。
  • 上下文仍在开始看我编辑的答案。
  • 如果抛出 IllegalStateException 怎么办?

标签: java servlets servletcontextlistener


【解决方案1】:

您无法阻止 Web 应用程序从 servlet 启动。

如果您想阻止 Web 应用程序启动,请将您的测试移动到 ServletContextListenercontextInitialized() 方法中的异常将阻止 Web 应用程序启动。

如果您使用的是最新的 Tomcat 7.0.x 或 8.0.x 版本,您可以在上下文或主机上使用 Tomcat 特定选项failCtxIfServletStartFails,如果任何启动时加载的 servlet 失败,将导致 Web 应用程序失败但这是非标准的。 ServletContextListener 是更好的选择。

【讨论】:

  • 当我阅读 Servlet Spec 版本 3.1 第 11.6 节时,它确实没有说当ServletContextListener::contextInitialized 遇到异常时 Web 应用程序部署停止。规范只是含糊地说“容器可能会以 HTTP 状态代码 500 来响应对 Web 应用程序的所有后续请求,以指示应用程序错误。”如果停止是您的 JSR 专家组的意图,请在即将发布的 Servlet 4 规范中阐明语言。这是一个混淆点;见my list of similar SO questions。 (Tomcat 8 停止,是的)
【解决方案2】:

只要在那里抛出任何异常。初始化将被中止。

【讨论】:

  • 伙计,这不起作用,请参阅我编辑的答案。上下文仍在启动
  • 不。无法启动的 Servlet 永远不会停止 Web 应用程序的启动(至少不是按照 Servlet 规范)。
猜你喜欢
  • 1970-01-01
  • 2011-12-07
  • 2015-05-17
  • 2015-02-16
  • 2016-04-27
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多