1. Обзор
Общим требованием в любом веб-приложении являются настраиваемые страницы ошибок.
Например, предположим, что вы используете ванильное приложение Spring MVC поверх Tomcat. Пользователь вводит неверный URL-адрес в своем браузере и показывает не очень удобную бело-голубую трассировку стека — не идеальный вариант.
В этом руководстве мы настроим настраиваемые страницы ошибок для нескольких кодов ошибок HTTP.
Рабочее предположение состоит в том, что читателю достаточно удобно работать с Spring MVC; если нет, то это отличный способ начать .
Эта статья посвящена Spring MVC. В нашей статье « Настройка страницы ошибок Whitelabel » описывается, как создать пользовательскую страницу ошибок в Spring Boot.
2. Простые шаги
Давайте начнем с простых шагов, которые мы собираемся выполнить здесь:
- Укажите один URL -адрес
/errors
вфайле web.xml
, который сопоставляется с методом, который будет обрабатывать ошибку всякий раз, когда возникает ошибка. - Создайте контроллер с именем
ErrorController
с отображением/errors
- Определите код ошибки HTTP во время выполнения и отобразите сообщение в соответствии с кодом ошибки HTTP
.
Например, если генерируется ошибка 404, пользователь должен увидеть сообщение типа«Ресурс не найден»,
тогда как при ошибке 500 пользователь должен увидеть что-то вроде«Извините! С нашей стороны возникла внутренняя ошибка сервера.
3. Веб- файл.xml
Начнем с добавления следующих строк в наш web.xml :
<error-page>
<location>/errors</location>
</error-page>
Обратите внимание, что эта функция доступна только в версиях сервлетов выше 3.0.
Любая ошибка, сгенерированная в приложении, связана с кодом ошибки HTTP. Например, предположим, что пользователь вводит URL -адрес /invalidUrl
в браузере, но такой RequestMapping
не был определен внутри Spring. Затем HTTP-код 404 генерируется базовым веб-сервером. Строки, которые мы только что добавили в наш web.xml
, говорят Spring выполнить логику, написанную в методе, который сопоставлен с URL-адресом /errors.
Небольшое замечание: соответствующая конфигурация сервлета Java, к сожалению, не имеет API для настройки страницы ошибки, поэтому в этом случае нам действительно нужен файл web.xml
.
4. Контроллер
Двигаясь дальше, мы теперь создаем наш ErrorController
. Мы создаем единый объединяющий метод, который перехватывает ошибку и отображает страницу с ошибкой:
@Controller
public class ErrorController {
@RequestMapping(value = "errors", method = RequestMethod.GET)
public ModelAndView renderErrorPage(HttpServletRequest httpRequest) {
ModelAndView errorPage = new ModelAndView("errorPage");
String errorMsg = "";
int httpErrorCode = getErrorCode(httpRequest);
switch (httpErrorCode) {
case 400: {
errorMsg = "Http Error Code: 400. Bad Request";
break;
}
case 401: {
errorMsg = "Http Error Code: 401. Unauthorized";
break;
}
case 404: {
errorMsg = "Http Error Code: 404. Resource not found";
break;
}
case 500: {
errorMsg = "Http Error Code: 500. Internal Server Error";
break;
}
}
errorPage.addObject("errorMsg", errorMsg);
return errorPage;
}
private int getErrorCode(HttpServletRequest httpRequest) {
return (Integer) httpRequest
.getAttribute("javax.servlet.error.status_code");
}
}
5. Интерфейс
В демонстрационных целях мы сохраним нашу страницу ошибок очень простой и компактной. Эта страница будет содержать только сообщение, отображаемое на белом экране. Создайте файл jsp с именем
errorPage.jsp:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page session="false"%>
<html>
<head>
<title>Home</title>
</head>
<body>
<h1>${errorMsg}</h1>
</body>
</html>
6. Тестирование
Мы смоделируем две наиболее распространенные ошибки, возникающие в любом приложении: ошибку HTTP 404 и ошибку HTTP 500.
Запустите сервер и перейдите на localhost:8080/spring-mvc-xml/invalidUrl.
Поскольку этот URL-адрес не существует, мы ожидаем увидеть нашу страницу с ошибкой с сообщением « Код ошибки HTTP: 404. Ресурс не найден».
Давайте посмотрим, что происходит, когда один из методов обработчика генерирует исключение NullPointerException.
Добавляем в ErrorController
следующий метод : ``
@RequestMapping(value = "500Error", method = RequestMethod.GET)
public void throwRuntimeException() {
throw new NullPointerException("Throwing a null pointer exception");
}
Перейдите на локальный хост: 8080/spring-mvc-xml/500Error.
Вы должны увидеть белый экран с сообщением «Код ошибки HTTP: 500. Внутренняя ошибка сервера».
7. Заключение
Мы увидели, как настроить страницы ошибок для разных HTTP-кодов с помощью Spring MVC .
Мы создали одну страницу ошибки, на которой сообщение об ошибке отображается динамически в соответствии с кодом ошибки HTTP.