2015-05-31 3 views
0

У меня проблемы с обработкой исключений в приложении веб-сервлета. Я создал ErrorHandler сервлет, который обрабатывает все входящие исключения и добавляемые записи в файле web.xml:Обработка исключений сервлетов

<servlet> 
    <servlet-name>ErrorHandler</servlet-name> 
    <servlet-class>ServletPackage.ErrorHandler</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>ErrorHandler</servlet-name> 
    <url-pattern>/ErrorHandler</url-pattern> 
</servlet-mapping> 
<error-page> 
    <exception-type>java.lang.Exception</exception-type> 
    <location>/ErrorHandler</location> 
</error-page> 

Проблема заключается в том, что сервер не вызывать ErrorHandler сервлет вообще. Glassfish просто бросает Исключение в консоли и веб-браузере обновляет сервлет, который выбрасывает исключение (без данных из-за необработанного исключения).

Warning: StandardWrapperValve[SessionChecker]: Servlet.service() for servlet SessionChecker threw exception 
javax.servlet.ServletException: Forced exception thrown 
    at ServletPackage.SessionChecker.processRequest(SessionChecker.java:158) 
    at ServletPackage.SessionChecker.doPost(SessionChecker.java:174) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:344) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) 
    . 
    . 
    . 

Любые предложения?

+0

Все советы? Мне действительно нужно заставить его работать так, как надо, и нет кровавой идеи, почему ErrorHandler не может справиться с каким-либо исключением. Может быть, что-то не так с моим движением мыслей, и это не будет работать вообще таким образом? – baka1408

ответ

0

Если исключение выбрасывается с вашего веб-сервера, обработчик исключений, который вы объявили в web.xml, с ним никогда не будет иметь дело.

Обработчик исключений в файле web.xml предназначен для обработки запроса, поступающего на веб-сервер.

+0

Есть ли способ проверить мой ErrorHandler? Я полагаю, что невозможно исключить исключение из HTTP-запроса, поступающего с веб-сайта, и если его невозможно выбросить из другого сервлета, как вы сказали, я не совсем понимаю цель и цель этого. На turtorialspoint.com я прочитал «Когда сервлет генерирует исключение, веб-контейнер ищет конфигурации в web.xml, которые используют элемент типа исключения для соответствия с типом исключенного исключения». Это именно то, что я пытаюсь сделать, выбрасывая исключение из кода сервлета. – baka1408

+0

Я раньше не использовал этот механизм. Но возможно ли, что тип исключения должен быть точным совпадением, т. Е. Совпадением на полностью квалифицированном имени класса, а не совпадающим с любым классом в иерархии типа. –

+0

Не имеет значения, я пробовал с ServletException или IOException, и результат тот же. Однако я задаюсь вопросом, может ли проблема быть вызвана классом фильтра, который затрагивает все сервлеты моего проекта. – baka1408

0

У меня был такой же выпуск. Во всем мире примеры, как вы показали, и когда я это пробовал, казалось, что сервлет моего обработчика просто игнорировался полностью.

То, что работало для меня, чтобы убедиться, что моя обработка ошибок сервлет реализована как doGet и doPost:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    processError(request, response); 
} 

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    processError(request, response); 
} 

private void processError(HttpServletRequest request, HttpServletResponse response) throws IOException 
{ 
    Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception"); 
    ... 
} 

примеры, которые я на основе моего сервлета на уже реализована только doGet. Поэтому, когда мой сервлет загружался и вызывал ошибки, с этими ошибками ничего не происходило. Реализация doPost для обработки ошибок одинаково решает это для меня.

Смежные вопросы