В моем приложении 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 вместо этого?




Я думаю, вам не нужен порядок здесь, если у вас нет нескольких обработчиков. Из приведенного выше кода я вижу, что у вас есть 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.