Как отследить ошибки Spring при запуске веб-приложения Tomcat? - PullRequest
4 голосов
/ 10 октября 2011

У меня есть веб-приложение, работающее в 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 и, возможно, изменило файл приветствия, чтобы он указывал на страницу с сообщением об ошибке? Или есть какой-то другой способ, которым веб-приложение может изящно обработать это исключение?

Спасибо

Ответы [ 2 ]

0 голосов
/ 10 октября 2011

Вы можете добавить фильтр сервлетов в ваше веб-приложение, которое будет перехватывать все запросы к сервлету Spring и перенаправлять на страницу пользовательских ошибок в случае сбоя инициализации Spring.

0 голосов
/ 10 октября 2011

Обычно вы спрашиваете, можете ли вы иметь работающее веб-приложение после того, как веб-приложение не запускается.

Вы можете попробовать настроить страницу обработчика 503 и / или иметь страницу приветствия, не зависящую отSpring, который проверяет что-то в контексте приложения, настроенное только на хорошую скорость.Если это не произойдет, исключение, которое вы уже перехватили, может быть помещено в контекст приложения.

Не уверен, если что-нибудь в приложении, даже ресурсы только для web.xmlЕсли весна не раскручивается, хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...