Какое значение заказа я использую в ControllerAdvice, если в моих библиотеках также могут быть ControllerAdvices с аннотациями Order, о которых я не знаю? - PullRequest
2 голосов
/ 09 октября 2019

У меня есть приложение Spring 4 с несколькими ControllerAdvices, помеченными @Order (someValue). Кроме того, я обнаружил ControllerAdvice в одной из моих внешних библиотек, также помеченных @Order (someValue).

Насколько я понимаю, когда Controller создает исключение, порядок ControllerAdvices определяет порядок, в котором ControllerAdvices ищет это конкретное исключение. Теперь я думаю, что также возможно, что в моих внешних библиотеках есть другие ControllerAdvices с аннотациями @Order. Однако я не могу загрузить все библиотеки и выполнить поиск всех ControllerAdvices и проверить их значения Order.

Как узнать, какое значение Order следует поместить в конкретный ControllerAdvice, если я хочу его перехватить? исключения перед другими ControllerAdvices? Должен ли я использовать другой подход для моего варианта использования?

См. Код ниже.

Я хочу, чтобы ExceptionHandlerControllerTwo захватывал исключения после ExceptionHandlerControllerOne и до ExceptionHandlerControllerThree.

Я пробовал другой порядокзначения для ExceptionHandlerControllerTwo. Числа с 1 по 90, похоже, ловили исключения так, как я этого хотел. В моих внешних библиотеках могут быть другие ControllerAdvices, о которых я не знаю.

В моем приложении:

@ControllerAdvice
@Order(0)
public class ExceptionHandlerControllerOne {
   // multiple @ExceptionHandler methods
}
@ControllerAdvice
@Order(80)
public class ExceptionHandlerControllerTwo {
   // multiple @ExceptionHandler methods
}
@ControllerAdvice
@Order(90)
public class ExceptionHandlerControllerThree {
   // multiple @ExceptionHandler methods
}

Во внешней библиотеке:

@ControllerAdvice
@Order(100)
@Slf4j
public class CatchAllExceptionHandlerController {
   // multiple @ExceptionHandler methods
}

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

@ Order (Ordered.HIGHEST_PRECEDENCE) сделает свое дело, что скажет каркасу, что нужно выполнить рекомендацию, помеченную как HIGHEST_PRECEDENCE.

0 голосов
/ 09 октября 2019

Вы можете попытаться найти все @ControllerAdvice -аннотированные бобы и, в соответствии с результатом, вы определите порядок. Чтобы найти заказ, у вас может быть что-то вроде:

ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false);
scanner.addIncludeFilter(new AnnotationTypeFilter(ControllerAdvice.class));
scanner.findCandidateComponents("org.example") // Change the package name
        .stream()
        .filter(AnnotatedBeanDefinition.class::isInstance)
        .map(AnnotatedBeanDefinition.class::cast)
        .forEach(annotatedBeanDefinition -> {
            System.out.println(
                    annotatedBeanDefinition.getBeanClassName() + ": " +
                    annotatedBeanDefinition.getMetadata().getAllAnnotationAttributes(Order.class.getName())
            );
        });
...