Пользовательские страницы ошибок с Spring MVC
1. обзор
Общим требованием в любом веб-приложении являются настраиваемые страницы ошибок.
Например, предположим, что вы запускаете обычное приложение Spring MVC поверх Tomcat. Пользователь вводит недопустимый URL-адрес в своем браузере и отображает не очень удобную для пользователя трассировку сине-белого стека - не идеально.
В этом руководстве мы настроим настраиваемые страницы ошибок для нескольких кодов ошибок HTTP.
Предполагается, что читателю достаточно комфортно работать со Spring MVC; если нет,this is a great way to start.
2. Простые шаги
Давайте начнем с простых шагов, которые мы собираемся выполнить здесь:
-
Укажите один URL-адрес/errors вweb.xml, который сопоставляется с методом, который будет обрабатывать ошибку всякий раз, когда возникает ошибка
-
Создайте контроллер с именемErrorController с отображением/errors
-
Выясните код ошибки HTTP во время выполнения и отобразите сообщение в соответствии с кодом ошибки HTTP.. Например, если генерируется ошибка 404, пользователь должен увидеть сообщение типа‘Resource not found' ,, тогда как для ошибки 500 ошибка, пользователь должен увидеть что-то в строках‘Sorry! An Internal Server Error was generated at our end'
3. web.xml
Начнем с добавления следующих строк к нашемуweb.xml:
/errors
Обратите внимание, что эта функция доступна только в версиях сервлета более 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"%>
Home
${errorMsg}
6. тестирование
Мы смоделируем две наиболее распространенные ошибки, возникающие в любом приложении: ошибка HTTP 404 и ошибка HTTP 500.
Запустите сервер и перейдите кlocalhost:8080/spring-mvc-xml/invalidUrl.. Поскольку этот URL не существует, мы ожидаем увидеть нашу страницу с ошибкой с сообщением «Http Error Code : 404. Resource not found'.
Давайте посмотрим, что происходит, когда один из методов-обработчиков выдаетNullPointerException.. Мы добавляем следующий метод вErrorController:
@RequestMapping(value = "500Error", method = RequestMethod.GET)
public void throwRuntimeException() {
throw new NullPointerException("Throwing a null pointer exception");
}
Перейдите кlocalhost:8080/spring-mvc-xml/500Error.. Вы должны увидеть белый экран с сообщением «Http Error Code: 500. Внутренняя ошибка сервера'.
7. Заключение
Мы увидели, как настроить страницы ошибок для разных кодов HTTP с помощью Spring MVC.. Мы создали одну страницу с ошибкой, на которой сообщение об ошибке отображается динамически в соответствии с кодом ошибки HTTP.