«1. Обзор

Общим требованием для любого веб-приложения являются настраиваемые страницы ошибок.

Например, предположим, что вы используете ванильное приложение Spring MVC поверх Tomcat. Пользователь вводит неверный URL-адрес в своем браузере и показывает не очень удобную бело-голубую трассировку стека — не идеально.

В этом руководстве мы настроим настраиваемые страницы ошибок для нескольких кодов ошибок HTTP.

Рабочее предположение состоит в том, что читателю достаточно удобно работать с Spring MVC; если нет, то это отличный способ начать.

Эта статья посвящена Spring MVC. В нашей статье «Настройка страницы ошибок Whitelabel» описывается, как создать пользовательскую страницу ошибок в Spring Boot.

2. Простые шаги

Давайте начнем с простых шагов, которые мы собираемся выполнить здесь:

  1. Specify a single URL /errors in web.xml that maps to a method that would handle the error whenever an error is generated
  2. Create a Controller called ErrorController with a mapping /errors
  3. Figure out the HTTP error code at runtime and display a message according to the HTTP error code. For instance, if a 404 error is generated, then the user should see a message like ‘Resource not found’ , whereas for a 500 error, the user should see something on the lines of ‘Sorry! An Internal Server Error was generated at our end’

3. Web.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");
}

Перейти на localhost:8080/spring-mvc-xml/500Error. Вы должны увидеть белый экран с сообщением «Код ошибки HTTP: 500. Внутренняя ошибка сервера».

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

Мы увидели, как настроить страницы ошибок для разных кодов HTTP с помощью Spring MVC. Мы создали одну страницу ошибки, на которой сообщение об ошибке отображается динамически в соответствии с кодом ошибки HTTP.