Обработка исключений сервлетов 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,, мы видим обработку ошибок сервлета по умолчанию:
Обработка ошибок по умолчанию обеспечивается контейнером сервлета и может быть настроена на уровнеcontainer или приложения.
4. Пользовательская обработка ошибок
Мы можем определить настраиваемую обработку ошибок с помощью файлового дескриптораweb.xml, в котором мы можем определить следующие типы политик:
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.