在启动Tomcat webapp时如何捕获Spring错误?

时间:2011-10-10 16:21:54

标签: spring gwt tomcat

我在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正常处理此异常?

由于

2 个答案:

答案 0 :(得分:0)

基本上,在Web应用程序无法启动后,您会询问是否可以使用正常运行的Web应用程序。

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

不确定应用程序中是否有任何,即使是只有web.xml资源,如果Spring没有启动,也不知道。

答案 1 :(得分:0)

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