У меня есть веб-приложение, работающее в Tomcat, которое использует 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 не продолжается, поэтому остальная часть веб-приложения не может быть использована. Переход к URL-адресу веб-приложения приводит к ошибке HTTP 503 «Служба недоступна».
Я хочу уловить эту ошибку и отобразить для пользователя страницу (при первом переходе к приложению), объяснив, в чем проблема, вероятно, и предложив исправления. Как я могу это сделать?
Я попытался использовать пользовательский класс ContextLoaderListener, который делегирует класс в XML выше, но перехватывает любые исключения. Это позволяет мне перехватить исключение, но я мало что могу сделать - web.xml по-прежнему направляет запрос пользователя на сервлет, который не запускается после сбоя инициализации Spring. Можно ли каким-либо образом изменить конфигурацию веб-приложения при обнаружении этого исключения, чтобы оно не пыталось загрузить сервлеты из файла web.xml и, возможно, изменило файл приветствия, чтобы он указывал на страницу с сообщением об ошибке? Или есть какой-то другой способ, которым веб-приложение может изящно обработать это исключение?
Спасибо