【问题标题】:Disable Spring from Starting up after BeanInstantiationException (Tomcat)在 BeanInstantiationException (Tomcat) 之后禁用 Spring 启动
【发布时间】:2011-04-07 18:50:35
【问题描述】:

对于我目前正在从事的项目,当 spring 无法初始化某些 bean(在初始化期间调用 webservices,因此可能会崩溃)时,需要禁用要启动的 webapp 上下文。

但是,当 bean 在初始化期间抛出任何异常时,它看起来像这样:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'latestAdsRepository' defined in file [...]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [...]: Constructor threw exception; nested exception is java.io.IOException: SHUT DOWN NOW!!
...
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [...]: Constructor threw exception; nested exception is java.io.IOException: SHUT DOWN NOW!!

然而上下文开始并且所有对无法启动的bean的引用都是null。不用说,这会导致各种错误的 Nullpointer 异常。特别是因为这个 bean 对于 webapp 非常重要。

所以我需要一种方法来明确告诉 Spring,如果无法初始化 bean,则此 webapp 无法启动。然而 System.exit(1) 不是一个选项,因为在这个 Tomcat 服务器上还有其他 webapps。

有什么想法吗?

【问题讨论】:

标签: java spring tomcat


【解决方案1】:

据我所知,默认情况下,如果异常通过启动侦听器传播到 servlet 容器,则当 Spring 无法实例化 bean 时,上下文启动会失败。

您可以使用@Required注解将某个注入点标记为强制。

【讨论】:

  • 感谢您的回答,但是使用 @Required 注释根本没有帮助。我注意到的是:当上下文启动时(在无法创建所有 bean 之后),它每次都会尝试重新创建丢失的 bean,它们会被使用。这是某种新的默认行为吗?我还没有在配置中启用类似的功能。
  • 它们属于默认(单例)范围
  • 也许你可以给 applicationContext.xml..因为我几乎可以肯定默认行为是不初始化上下文。另外,提供更多的 tomcat 日志,主要是 SEVERE 部分。
【解决方案2】:

你是如何加载 Spring 上下文的?

听起来您可能是手动执行此操作(即您在某处调用 new ApplicationContext()),而是应该使用 ContextLoaderListener 以便在应用程序启动时自动加载您的上下文(并在应用程序关闭期间关闭)。 Spring 上下文启动期间的异常将传播到 Web 应用程序上下文启动失败。

【讨论】:

    猜你喜欢
    • 2015-09-20
    • 2019-06-03
    • 2017-10-30
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2020-08-30
    • 2018-12-08
    相关资源
    最近更新 更多