Получить доступ

Чем @ControllerAdvice отличается от @ExceptionHandler внутри контроллера?

MiddleВалидация и обработка ошибокSpring
Ещё спрашивают так:
  • Какой обработчик исключений выиграет?
Коротко

@ExceptionHandler в контроллере — локальный, в @ControllerAdvice — глобальный. Локальный обработчик подходящего типа выигрывает у глобального.

  • Среди нескольких — побеждает наиболее конкретный тип исключения
  • @ControllerAdvice(basePackages = …) или assignableTypes — ограничить область
  • Порядок нескольких advice — @Order

А ещё @RestControllerAdvice = @ControllerAdvice + @ResponseBody

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Порядок разрешения такой: сначала ищется @ExceptionHandler в самом контроллере, затем в @ControllerAdvice; среди нескольких подходящих выбирается наиболее специфичный по типу исключения. Область действия совета можно сузить аннотациями, пакетами или типами через параметры @ControllerAdvice, а порядок нескольких советов задаётся @Order. Практическая рекомендация: держать один глобальный @RestControllerAdvice с единым форматом ошибки и correlation id, а локальные обработчики заводить только там, где нужна действительно контроллер-специфичная реакция. И не забывать, что наружу не отдают стектрейсы и внутренние сообщения.

Что хотят услышать

  • Локальная и глобальная области.
  • Правила выбора обработчика.

Частые ошибки

  • Заводить обработчик Exception, перехватывающий всё и скрывающий настоящие ошибки.
  • Отдавать в теле ответа сообщение исключения как есть.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓@ControllerAdvice выносит обработчики на все контроллеры сразу; локальный @ExceptionHandler действует только в своём контроллере и имеет приоритет
  • ✗@ControllerAdvice обрабатывает только неконтролируемые исключения
  • ✗Локальный @ExceptionHandler игнорируется при наличии @ControllerAdvice
  • ✗@ControllerAdvice работает только с ошибками валидации

Что спросят дальше

  • Как ограничить область действия @ControllerAdvice?
  • Как логировать исключение и при этом не раскрыть детали клиенту?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем