2016-04-13 8 views
1

Я внедрил ServletContextListener в веб-приложении Java Servlet через аннотацию @WebListener. В моем методе contextInitialized я выполняю некоторую настройку и проверяю, доступны ли ожидаемые ресурсы.Остановить запуск веб-приложения из `ServletContextListener` метода` contextInitialized`

Если я определяю в этом методе contextInitialized что-то не так, как остановить веб-приложение от продолжения с выполнением сервлетов? Эти сервлеты не должны выполняться, если среда не подходит (например, недоступна база данных).

Как грациозно обрабатывать неисправную среду для веб-приложения на основе сервлетов?

+0

Вы пытались выбросить исключение? –

ответ

2

Нет, похоже, что интерфейс ServletContextListener был не, предназначенный для предотвращения запуска веб-приложения.

Как this Answer состояния, сервлетов спецификации говорит ServletContextListenerможет каким-то образом отключить доступ к веб-приложению, когда исключение встречается. Это слово may означает необязательный, не требуется. Кроме того, спецификация точно определяет, что означает остановка доступа к веб-приложению.

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

Мой опыт работы с Tomcat 8.0.33 ... Ввод throw new RuntimeException ("bogus stop servlet "); в методе contextInitialized предотвращает развертывание приложения. Консоль во время развертывания в отчетах IDE сообщает «FAIL - развернутое приложение в контексте контекста/но контекст не запускался». К сожалению, ни эта консоль, ни ни одна из журналов не записывают отчет о фактическом исключении. Поэтому, если вы выбросите несколько исключений из одного или нескольких слушателей, отладка не будет очевидна.

Как упоминалось в другом месте в переполнении стека, наиболее надежным решением, вероятно, является то, что ваш ServletContextListener отмечает успех или неудачу с переменной флагов, хранящейся в сеансе сервлета. Затем получите код сервлета и проверьте этот флаг. Тогда ваш код сервлета определит соответствующий курс действий. Ваше веб-приложение будет развернуто, но ваш собственный сервлет (ы) может выбрать ничего не делать и отправить код ошибки HTTP.

Похожие вопросы:

Примечание: при добавлении или редактировании ServletContextListener вам может потребоваться выполнить операцию «очистить и построить» в вашем проекте. Функция «горячей» замены или развертывания во время разработки вашей среды разработки не может воспринимать новый или измененный прослушиватель. Отслеживайте свой код или выполняйте некоторые протоколирования для проверки.