Spring Boot: настроить страницу ошибки Whitelabel

Spring Boot: настроить страницу ошибки Whitelabel

1. обзор

В этой статье мы рассмотрим, как использоватьdisable and customize the default error page for a Spring Boot application, поскольку правильная обработка ошибок свидетельствует о профессионализме и качественной работе.

2. Отключение страницы ошибки Whitelabel

Во-первых, давайте посмотрим, как мы можем полностью отключить страницу ошибок с белой меткой, установив для свойстваserver.error.whitelabel.enabled значениеfalse:

server.error.whitelabel.enabled=false

Добавление этой записи в файл application.properties отключит страницу ошибки и покажет краткую страницу, которая исходит из базового контейнера приложения, например Tomcat.

We can achieve the same result by excluding the ErrorMvcAutoConfiguration bean. Мы можем сделать это, добавив эту запись в файл свойств:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration

#for Spring Boot 2.0
#spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration

Или добавив эту аннотацию в основной класс:

@EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class})

Все методы, упомянутые выше, отключат страницу ошибки белой метки. Это оставляет нас с вопросом о том, кто тогда на самом деле обрабатывает ошибку?

Как уже упоминалось выше, обычно это базовый контейнер приложения. Хорошо, что мы можем дополнительно настраивать вещи, показывая наши пользовательские страницы ошибок вместо всех значений по умолчанию - это фокус следующего раздела.

3. Отображение настраиваемых страниц ошибок

Сначала нам нужно создать собственную страницу ошибки HTML.

We’ll save the file as error.html, поскольку мы используем двигатель со ствольной пластинойThymeleaf :




Something went wrong!

Our Engineers are on it

Go Home

If we save this file in resources/templates directory, it’ll automatically be picked up по умолчаниюBasicErrorController Spring Boot.

Это все, что нам нужно для отображения нашей пользовательской страницы ошибок. Благодаря некоторому стилю у нас теперь будет гораздо более привлекательная страница ошибок для наших пользователей:

 

Spring Boot Custom Error Page

Мы можем быть более конкретными, назвав файл с кодом HTTP-статуса, который мы хотим использовать, например. сохранение файла как404.html вresources/templates/error означает, что он будет использоваться явно для ошибок 404.

3.1. ПользовательскийErrorController

Ограничение пока состоит в том, что мы не можем запускать пользовательскую логику при возникновении ошибок. Для этого мы должны создать bean-компонент контроллера ошибок, который заменит тот, который используется по умолчанию.

Для этогоwe have to create a class that implements the ErrorController interface и егоgetErrorPath() to переопределяют возврат настраиваемого пути для вызова при возникновении ошибки:

@Controller
public class MyErrorController implements ErrorController  {

    @RequestMapping("/error")
    public String handleError() {
        //do something like logging
        return "error";
    }

    @Override
    public String getErrorPath() {
        return "/error";
    }
}

В приведенном выше фрагменте мы также аннотируем класс с помощью@Controller и создаем сопоставление для пути, возвращаемогоgetErrorPath(). Таким образом, контроллер может обрабатывать вызовы пути/error.

ВhandleError() мы возвращаем пользовательскую страницу ошибки, которую мы создали ранее. Если мы сейчас выдадим ошибку 404, отобразится наша настраиваемая страница.

Давайте дополнительно улучшимhandleError(), чтобы отображать определенные страницы ошибок для разных типов ошибок.

Например, у нас могут быть красиво оформленные страницы специально для 404 и 500 типов ошибок. Затем мы можем использовать HTTP-код ошибки для определения подходящей страницы ошибки для отображения:

@RequestMapping("/error")
public String handleError(HttpServletRequest request) {
    Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);

    if (status != null) {
        Integer statusCode = Integer.valueOf(status.toString());

        if(statusCode == HttpStatus.NOT_FOUND.value()) {
            return "error-404";
        }
        else if(statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
            return "error-500";
        }
    }
    return "error";
}

Тогда, например, при ошибке 404 мы увидим страницуerror-404.html:

image

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

С помощью этой информации мы можем теперь более элегантно обрабатывать ошибки и показывать нашим пользователям эстетическую страницу.

Как всегда, доступен полный исходный кодover on Github.