Весенний порядок WebExceptionHandler

В моем приложении Spring Webflux у меня есть аннотированный класс @ControllerAdvice, который реализует WebExceptionHandler, с его @Order установленным на -2, и моя идея состоит в том, чтобы он был глобальным обработчиком исключений.

В этом классе я проверяю тип полученного Throwable и обрабатываю его соответствующим образом, например так:

@Component
@Slf4j
@Order(-2)
@ControllerAdvice
public class CustomWebExceptionHandler implements WebExceptionHandler {

    @Override
    public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
           if (ex instanceof ResponseStatusException) {
                ... do something
           }
           if (ex instanceof DomainException) {
                ... do something else
           }
}

В одном из этих блоков «... сделай что-нибудь» я допустил ошибку и выдал IllegalArgumentException. Я думал, что это будет обрабатываться тем же классом, но в итоге он был обработан DefaultErrorWebExceptionHandler, у которого есть @Order(-1).

Мой вопрос: возможно ли, чтобы это IllegalArgumentException обрабатывалось моим CustomWebExceptionHandler вместо этого?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
572
1

Ответы 1

Я думаю, вам не нужен порядок здесь, если у вас нет нескольких обработчиков. Из приведенного выше кода я вижу, что у вас есть CustomWebExceptionHandler, аннотированный ControllerAdvice. По умолчанию методы в @ControllerAdvice применяются глобально ко всем контроллерам. Теперь, чтобы поймать все исключения брошены этими целевыми контроллерами, вы можете просто определить метод с @ExceptionHandler с параметром throwable в качестве параметра, что-то вроде этого должно работать для вас:

    @ControllerAdvice
    public class CustomWebExceptionHandler {
        @ExceptionHandler
        public ResponseEntity handleExceptions(Throwable ex)
        {
           if (ex instanceof ResponseStatusException) {
                ... do something
           }
           if (ex instanceof DomainException) {
                ... do something else
           }
        }
    }

У вас может быть несколько обработчиков исключений (для каждого исключения), если вы хотите увидеть подробный ответ здесь Установка приоритета нескольких @ControllerAdvice @ExceptionHandlers.

Другие вопросы по теме