Что проверяет вопрос про @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 — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки