1. Обзор
В этой статье мы рассмотрим, как отключить и настроить страницу ошибок по умолчанию для приложения Spring Boot , поскольку правильная обработка ошибок свидетельствует о профессионализме и качестве работы.
2. Отключение страницы с ошибкой белой метки
Во-первых, давайте посмотрим, как мы можем полностью отключить страницу ошибок с белой меткой, установив для свойства server.error.whitelabel.enabled значение false:
server.error.whitelabel.enabled=false
Добавление этой записи в файл application.properties отключит страницу с ошибкой и отобразит краткую страницу, созданную из базового контейнера приложения, например Tomcat.
Мы можем достичь того же результата, исключив ErrorMvcAutoConfiguration компонент. Мы можем сделать это, либо добавив эту запись в файл свойств:
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.
Мы сохраним файл как error.html так как мы используем Thymeleaf механизм шаблонов:
Something went wrong!
Our Engineers are on it
Go Home
Если мы сохраним этот файл в каталоге ресурсы/шаблоны , он будет автоматически подхвачен контроллером BasicErrorController весенней загрузки по умолчанию .
Это все, что нам нужно для отображения нашей пользовательской страницы ошибок. С некоторой стилизацией у нас теперь будет гораздо более приятная страница ошибок для наших пользователей:
Мы можем быть более конкретными, назвав файл кодом состояния HTTP, который мы хотим использовать, например, сохранив файл как 404.html в ресурсы/шаблоны/ошибка означает, что он будет явно использоваться для 404 ошибок.
3.1. Пользовательский контроллер ошибок
Ограничение до сих пор заключается в том, что мы не можем запускать пользовательскую логику при возникновении ошибок. Чтобы достичь этого, мы должны создать компонент контроллера ошибок, который заменит компонент по умолчанию.
Для этого мы должны создать класс, реализующий Контроллер ошибок интерфейс , и переопределить его метод getErrorPath () , чтобы вернуть пользовательский путь для вызова при возникновении ошибки.
Однако, начиная с версии 2.3.x, Spring Boot устарел этот метод, и вместо этого для указания пользовательского пути следует использовать свойство server.error.path .
Но поскольку он все еще является частью интерфейса Контроллера ошибок и не был удален полностью, нам нужно будет переопределить его, иначе компилятор пожалуется. Чтобы обойти проблему здесь, мы возвращаем null , так как это в любом случае будет проигнорировано:
@Controller public class MyErrorController implements ErrorController { @RequestMapping("/error") public String handleError() { //do something like logging return "error"; } @Override public String getErrorPath() { return null; } }
В приведенном выше фрагменте мы также аннотируем класс с помощью @Controller и создаем сопоставление для пути, указанного в качестве свойства server.error.path:
server.error.path=/error
Таким образом, контроллер может обрабатывать вызовы по пути /ошибка .
В HandleError () мы возвращаем пользовательскую страницу ошибок , созданную ранее. Если мы сейчас вызовем ошибку 404, то будет отображена наша пользовательская страница.
Давайте еще больше укрепим Ошибка управления() для отображения определенных страниц ошибок для различных типов ошибок.
Например, у нас могут быть красиво оформленные страницы, специально предназначенные для 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 страница:
4. Заключение
С помощью этой информации мы можем теперь более элегантно обрабатывать ошибки и показывать вашим пользователям эстетичную страницу.
Как всегда, полный исходный код доступен на Github .