Что проверяет вопрос про @Order на @ExceptionHandler

Вопрос звучит просто: у вас два @ControllerAdvice класса, в каждом свой @ExceptionHandler(RuntimeException.class). Какой сработает первым?

Проверяют не знание аннотации, а понимание того, что Spring резолвит обработчики исключений в два этапа. Сначала ищет самый специфичный тип исключения среди всех кандидатов, потом при равенстве специфичности — смотрит на порядок @ControllerAdvice классов.

Без явного @Order порядок между классами не определён контрактом Spring — на практике зависит от порядка регистрации бинов, и это не то, на что стоит закладываться в продакшене.

@Order(1) @ControllerAdvice public class BusinessExceptionAdvice {

@ExceptionHandler(RuntimeException.class) public ResponseEntity handle(RuntimeException e) { return ResponseEntity.status(400).body(e.getMessage()); } }

Следующий вопрос почти всегда: а что если исключение точнее — например, ловите IllegalArgumentException в одном advice и RuntimeException в другом. Тогда порядок не важен: Spring выбирает более специфичный тип независимо от @Order. @Order решает только при равной специфичности типов исключений между разными advice-классами.

Специфичность типа исключения важнее порядка классов — @Order это тайбрейкер, а не главное правило.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки