Приложение Spring Boot имеет конфигурацию по умолчанию для обработки ошибок - ErrorMvcAutoConfiguration .
Что он делает в основном, если не предоставлена дополнительная конфигурация:
- создает контроллер глобальных ошибок по умолчанию - BasicErrorController
- это создает статическое представление по умолчанию «ошибка» «Страница ошибки Whitelabel».
BasicErrorController
по умолчанию подключен к «/ error». Если в приложении нет настраиваемого представления «ошибка», в случае возникновения исключения из какого-либо контроллера, пользователь переходит на страницу / error whitelabel, заполненную информацией BasicErrorController.
Если приложение имеет контроллер, реализующий ErrorController
, оно заменяет BasicErrorController
.
Если в контроллере обработки ошибок возникает какое-либо исключение, оно проходит через фильтр исключений Spring (см. Подробности ниже) и, наконец, если ничего не найдено, это исключение будет обработано контейнером нижележащего приложения, например, Кот. Базовый контейнер обработает исключение и покажет некоторую страницу / сообщение об ошибке в зависимости от его реализации.
Есть интересная информация в BasicErrorController
javadoc :
Основной глобальный контроллер ошибок, рендеринг ErrorAttributes. Более конкретные ошибки могут быть обработаны либо с помощью абстракций Spring MVC (например, @ ExceptionHandler ), либо путем добавления страниц ошибок сервера сервлетов.
Реализация
BasicErrorController
или ErrorController
представляет собой глобальный обработчик ошибок . Может использоваться вместе с @ ExceptionHandler.
Здесь мы подошли к ResponseEntityExceptionHandler
Удобный базовый класс для классов @ControllerAdvice, которые хотят обеспечить централизованную обработку исключений для всех методов @RequestMapping с помощью методов @ExceptionHandler.
Этот базовый класс предоставляет метод @ExceptionHandler для обработки внутренних исключений Spring MVC.
Другими словами, это означает, что ResponseEntityExceptionHandler
- это просто вспомогательный класс, который уже содержит обработку исключений Spring MVC. И мы можем использовать его как базовый класс для нашего пользовательского класса для обработки исключений контроллеров. Чтобы наш пользовательский класс работал, он должен быть помечен @ControllerAdvice
.
Классы, обозначенные @ControllerAdvice
, могут использоваться одновременно с глобальным обработчиком ошибок (реализация BasicErrorController
или ErrorController
). Если наш @ControllerAdvice
аннотированный класс (который может / или не может расширяться ResponseEntityExceptionHandler
) не обрабатывает какое-то исключение, то исключение отправляется в глобальный обработчик ошибок.
Пока мы смотрели на ErrorHandler
контроллер и все, что помечено @ControllerAdvice
. Но это намного сложнее.
В этом вопросе я нашел действительно ценную информацию - Установка приоритета нескольких @ControllerAdvice @ ExceptionHandlers .
Edit:
Для простоты:
- First Spring ищет обработчик исключений (метод, аннотированный @ExceptionHandler) в классах @ControllerAdvice. См. ExceptionHandlerExceptionResolver .
- Затем он проверяет, аннотировано ли выброшенное исключение с помощью @ResponseStatus или происходит от исключения ResponseStatusException. См. ResponseStatusExceptionResolver .
- Затем он проходит через обработчики по умолчанию исключений Spring MVC. См. DefaultHandlerExceptionResolver .
- И в конце, если ничего не найдено, элемент управления перенаправляется в представление страницы ошибок с глобальным обработчиком ошибок позади него. Этот шаг не выполняется, если исключение происходит от самого обработчика ошибок.
- Если представление об ошибке не найдено (например, глобальный обработчик ошибок отключен) или шаг 4 пропущен, то исключение обрабатывается контейнером.