Обработка исключений сервлета Java EE

Обработка исключений сервлетов Java EE

1. Вступление

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

2. Исключения сервлетов Java EE

Сначала мы определим сервлет, используяAPI annotations (подробнее см.Servlets Intro) с процессором по умолчаниюGET, который вызовет исключение:

@WebServlet(urlPatterns = "/randomError")
public class RandomErrorServlet extends HttpServlet {

    @Override
    protected void doGet(
      HttpServletRequest req,
      HttpServletResponse resp) {
        throw new IllegalStateException("Random error");
    }
}

3. Обработка ошибок по умолчанию

Давайте теперь просто развернем приложение в нашем контейнере сервлетов (мы предполагаем, что приложение работает подhttp://localhost:8080/javax-servlets).

Когда мы обращаемся к адресуhttp://localhost:8080/javax-servlets/randomError,, мы видим обработку ошибок сервлета по умолчанию:

image

Обработка ошибок по умолчанию обеспечивается контейнером сервлета и может быть настроена на уровнеcontainer или приложения.

4. Пользовательская обработка ошибок

Мы можем определить настраиваемую обработку ошибок с помощью файлового дескриптораweb.xml, в котором мы можем определить следующие типы политик:

  • Status code error handling - он позволяет нам отображать коды ошибок HTTP (client иserver) на статическую страницу ошибок HTML или сервлет обработки ошибок

  • Exception type error handling - он позволяет нам отображать типы исключений на статические страницы ошибок HTML или сервлет обработки ошибок

4.1. Обработка ошибок кода состояния с помощью HTML-страницы

Мы можем настроить нашу собственную политику обработки ошибок для ошибок HTTP 404 вweb.xml:



    
        404
        /error-404.html 
    

Теперь войдите вhttp://localhost:8080/javax-servlets/invalid.html из браузера - чтобы получить статическую страницу ошибки HTML.

4.2. Обработка ошибок типа исключения с помощью сервлета

Мы можем настроить нашу собственную политику обработки ошибок дляjava.lang.Exception вweb.xml:


    
        java.lang.Exception
        /errorHandler
    

ВErrorHandlerServlet мы можем получить доступ к деталям ошибки, используяerror attributes, предоставленный в запросе:

@WebServlet(urlPatterns = "/errorHandler")
public class ErrorHandlerServlet extends HttpServlet {

    @Override
    protected void doGet(
      HttpServletRequest req,
      HttpServletResponse resp) throws IOException {

        resp.setContentType("text/html; charset=utf-8");
        try (PrintWriter writer = resp.getWriter()) {
            writer.write("Error description");
            writer.write("

Error description

"); writer.write("
    "); Arrays.asList( ERROR_STATUS_CODE, ERROR_EXCEPTION_TYPE, ERROR_MESSAGE) .forEach(e -> writer.write("
  • " + e + ":" + req.getAttribute(e) + "
  • ") ); writer.write("
"); writer.write(""); } } }

Теперь мы можем получить доступ кhttp://localhost:8080/javax-servlets/randomError, чтобы увидеть, как работает настраиваемый сервлет ошибок.

Note: наш тип исключения, определенный вweb.xml, слишком широк, и мы должны указать все исключения, которые мы хотим обработать, более подробно.

Мы также можем использоватьcontainer-provided servlet logger в нашем компонентеErrorHandlerServlet для регистрации дополнительных сведений:

Exception exception = (Exception) req.getAttribute(ERROR_EXCEPTION);
if (IllegalArgumentException.class.isInstance(exception)) {
    getServletContext()
      .log("Error on an application argument", exception);
}

Стоит знать, что выходит за рамки механизмов ведения журнала, предоставляемых сервлетами, проверьтеguide on slf4j для получения дополнительных сведений.

5. Заключение

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

Как всегда, вы можете найти исходный код наServlets tutorial repository.