Пользовательские страницы ошибок с Spring MVC

Пользовательские страницы ошибок с Spring MVC

1. обзор

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

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

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

Предполагается, что читателю достаточно комфортно работать со Spring MVC; если нет,this is a great way to start.

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

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

  1. Укажите один URL-адрес/errors вweb.xml, который сопоставляется с методом, который будет обрабатывать ошибку всякий раз, когда возникает ошибка

  2. Создайте контроллер с именемErrorController с отображением/errors

  3. Выясните код ошибки 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.