【问题标题】:How do I catch Spring errors when starting up a Tomcat webapp?启动 Tomcat webapp 时如何捕获 Spring 错误?
【发布时间】:2011-12-04 16:07:15
【问题描述】:

我有一个在 Tomcat 中运行的 webapp,它使用 Spring 进行依赖注入。 (这是一个 GWT 应用程序,但我认为这对我正在寻找的解决方案没有太大影响。)

我的 web.xml 文件格式如下:

<web-app>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- Servlets -->
<servlet>
    <servlet-name>dispatch</servlet-name>
    <servlet-class>com.example.my.gwt.dispatch.DispatchServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatch</servlet-name>
    <url-pattern>/my_gwt/dispatch</url-pattern>
</servlet-mapping>

    ... more servlets ...

</web-app>

我的 Spring 配置做的一件事是通过 Hibernate 连接到数据库:

<bean id="datasource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${db.driver}" />
    <property name="url"
        value="${db.url}" />
    <property name="username" value="${db.username}" />
    <property name="password" value="${db.password}" />
</bean>
<bean id="databaseSessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="datasource" />
    <property name="packagesToScan">
        <array>
            <value>com.example.my.gwt.model</value>
        </array>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>
</bean>

如果数据库不可用,这会导致抛出 org.h2.jdbc.JdbcSQLException,因此 Spring 初始化不会继续,因此无法使用 webapp 的其余部分。导航到 webapp 的 URL 会出现 HTTP 503“服务不可用”错误。

我想要做的是捕捉该错误并向用户显示一个页面(当他们第一次导航到应用程序时)解释问题可能是什么并建议修复。我该怎么做?

我尝试使用自定义 ContextLoaderListener 类,该类委托给上述 XML 中的类,但会捕获任何异常。这使我能够捕获异常,但我无能为力 - web.xml 仍然将用户的请求指向一个在 Spring 初始化失败后未运行的 servlet。有什么方法可以在我捕获该异常时更改 webapp 配置,以便它不会尝试从 web.xml 加载 servlet,并且可能会更改欢迎文件以指向有关错误的页面?或者有没有其他方法可以让 webapp 优雅地处理这个异常?

谢谢

【问题讨论】:

    标签: spring gwt tomcat


    【解决方案1】:

    基本上,您是在询问在 Web 应用程序启动失败后您是否可以拥有一个正常运行的 Web 应用程序。

    您可以尝试配置 503 处理程序页面和/或创建一个不依赖于 Spring 的欢迎页面,以检查应用程序上下文中仅在良好启动时设置的某些内容。如果它没有启动,您已经捕获的异常可以放入应用上下文中。

    如果 Spring 没有启动,不确定应用程序中是否有 任何东西,甚至是 web.xml-only 资源。

    【讨论】:

      【解决方案2】:

      您可以向您的 Web 应用程序添加一个 Servlet 过滤器,如果 Spring 初始化失败,该过滤器将拦截对 Spring servlet 的所有请求并转发到您的自定义错误页面。

      【讨论】:

        猜你喜欢
        • 2011-03-03
        • 1970-01-01
        • 2021-04-17
        • 2016-07-11
        • 1970-01-01
        • 2019-10-31
        • 1970-01-01
        • 1970-01-01
        • 2018-12-11
        相关资源
        最近更新 更多