在我的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中的方法全局应用于所有 Controller 。现在要捕获那些目标 Controller 抛出的所有异常,您只需简单地使用@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
           }
        }
    }

如果希望在此处查看详细答案Setting Precedence of Multiple @ControllerAdvice @ExceptionHandlers,则可以具有多个Exception处理程序(每个异常)。

09-28 14:56