4

我的应用程序是由 Spring Boot 2 webflux 和 thymeleaf 制作的,我想捕获所有异常并将错误呈现到自定义错误页面。

我使用@ControllerAdvice 和@ExceptionHandler 在一个中心位置捕获异常和处理错误,我只能处理在我的控制器中抛出的所有异常,但我无法捕获那些映射错误(内容协商和HTTP 映射错误),例如UnsupportedMediaTypeStatusException . 我搜索并发现这是一个已知问题(https://github.com/spring-projects/sprienter code here ng-framework/issues/21097#issuecomment-453468295)。

如果我使用WebMvc,就没有这种问题,所有的异常都可以被捕获。我的问题是如何捕获所有异常并在 webflux 中显示我自己的错误页面。

这是简短的代码:

@ControllerAdvice
@Slf4j
public class DefaultExceptionHandlers {
    // works OK for my own thrown exception
    @ResponseStatus(HttpStatus.FORBIDDEN)
    @ExceptionHandler(value = CustomException1.class)
    public Mono<String> handleCustom1Exceptions(CustomException1 e) {
        return Mono.just("error1");
    }

    // works OK for my own thrown exception
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(value = CustomException2.class)
    public Mono<String> handleCustom2Exceptions(CustomException2 e) {
        return Mono.just("error2);
    }

    // This exception handler is not called at all for the exceptions which are thrown by spring framework
    @ResponseStatus(HttpStatus.FORBIDDEN)
    @ExceptionHandler(value = Exception.class)
    public Mono<String> handleAllExceptions(Exception e) {
        return Mono.just("error3);
    }
}
4

0 回答 0