我有一个在Tomcat中运行的web应用程序,该应用程序使用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的其余部分。导航到Web应用程序的URL会出现HTTP 503“服务不可用”错误。

我想做的就是捕捉到该错误,并向用户显示页面(当他们首次导航至应用程序时),以解释可能的问题以及建议的修复方法。我怎样才能做到这一点?

我尝试使用自定义的ContextLoaderListener类,该类委派给上述XML中的一个,但捕获任何异常。这使我能够捕捉到异常,但是我无能为力-web.xml仍将用户的请求指向一个在Spring初始化失败后未运行的servlet。遇到异常时,是否可以通过任何方式更改webapp配置,以使其不尝试从web.xml加载servlet,并且可能将欢迎文件更改为指向有关该错误的页面?还是有其他方法可以使Webapp正常处理此异常?

谢谢

最佳答案

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

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

不过,如果Spring没有启动,则不确定应用程序中是否有任何内容,甚至仅包含web.xml的资源。

07-26 06:17
查看更多