Spring WebExceptionHandler的顺序

时间:2019-02-21 20:51:13

标签: java spring spring-boot error-handling spring-webflux

在我的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的{​​{1}}处理。

我的问题是:可以由我的@Order(-1)处理此IllegalArgumentException吗?

1 个答案:

答案 0 :(得分:0)

我认为除非您有多个处理程序,否则您无需在此订购。从上面的代码中,我看到您有一个用CustomWebExceptionHandler注释的ControllerAdvice。默认情况下,@ControllerAdvice中的方法全局应用于所有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看到详细的答案,则可以有多个异常处理程序(每个异常)。