Чем @ControllerAdvice отличается от @ExceptionHandler внутри контроллера?
- Какой обработчик исключений выиграет?
@ExceptionHandler в контроллере — локальный, в @ControllerAdvice — глобальный. Локальный обработчик подходящего типа выигрывает у глобального.
- Среди нескольких — побеждает наиболее конкретный тип исключения
- @ControllerAdvice(basePackages = …) или assignableTypes — ограничить область
- Порядок нескольких advice — @Order
А ещё @RestControllerAdvice = @ControllerAdvice + @ResponseBody
Подробно
Порядок разрешения такой: сначала ищется @ExceptionHandler в самом контроллере, затем в @ControllerAdvice; среди нескольких подходящих выбирается наиболее специфичный по типу исключения. Область действия совета можно сузить аннотациями, пакетами или типами через параметры @ControllerAdvice, а порядок нескольких советов задаётся @Order. Практическая рекомендация: держать один глобальный @RestControllerAdvice с единым форматом ошибки и correlation id, а локальные обработчики заводить только там, где нужна действительно контроллер-специфичная реакция. И не забывать, что наружу не отдают стектрейсы и внутренние сообщения.
Что хотят услышать
- Локальная и глобальная области.
- Правила выбора обработчика.
Частые ошибки
- Заводить обработчик Exception, перехватывающий всё и скрывающий настоящие ошибки.
- Отдавать в теле ответа сообщение исключения как есть.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗@ControllerAdvice обрабатывает только неконтролируемые исключения сервисов
- ✓Advice действует на все контроллеры; локальный @ExceptionHandler — на свой и важнее
- ✗Локальный @ExceptionHandler игнорируется, если есть @ControllerAdvice
- ✗@ControllerAdvice работает только с ошибками валидации
Что спросят дальше
- Как ограничить область действия @ControllerAdvice?
- Как логировать исключение и при этом не раскрыть детали клиенту?
Разбор темы
- Валидация и обработка ошибок
Bean Validation и @Valid/@Validated, превращение ошибок в ответ, @ControllerAdvice и единый контракт, ProblemDetail (RFC 7807), multipart и interceptors.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.