在我的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处理程序(每个异常)。