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