详解 AbstractErrorWebExceptionHandler 类在 WebFlux 全局异常处理中的使用

看过源码的都知道,所有的框架基本上都会给你提供多条路,多个实现方式。WebFlux 也是一样,除了上一章中的 DefaultErrorAttributes,它还提供了 AbstractErrorWebExceptionHandler。本文说说 AbstractErrorWebExceptionHandler 的用法。

AbstractErrorWebExceptionHandler 看名称就知道,它也是一个抽象类。它提供的功能更多一些,更强大一些!

AbstractErrorWebExceptionHandler 使用代码如下:

@Component
@Order(-2)
public class GlobalErrorWebExceptionHandler extends AbstractErrorWebExceptionHandler {
    public GlobalErrorWebExceptionHandler(ErrorAttributes errorAttributes,
          ResourceProperties resourceProperties,
          ApplicationContext applicationContext){
        super(errorAttributes,resourceProperties,applicationContext);
    }
    @Override
    protected RouterFunction<ServerResponse> getRoutingFunction(
            ErrorAttributes errorAttributes) {
        return RouterFunctions.route(
                RequestPredicates.all(), this::renderErrorResponse);
    }
    private Mono<ServerResponse> renderErrorResponse(
            ServerRequest request) {
        Map<String, Object> errorPropertiesMap = getErrorAttributes(request, false);
        // 这里可以自定义处理逻辑
        errorPropertiesMap.put("xttblog", "www.xttblog.com");
        return ServerResponse.status(HttpStatus.BAD_REQUEST)
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .body(BodyInserters.fromObject(errorPropertiesMap));
    }
}

注解 @Order(-2) 这个注解。如果没有这个注解,你自定义的这个可能不会生效。因为 WebFlux 有一个默认的实现 DefaultErrorWebExceptionHandler,它的优先级是 @Order(-1)。所以加上 @Order(-2) 是让我们自己的实现拥有更高的优先级。

errorAttributes 对象将是我们在网络异常处理程序的构造函数传递一个的精确副本。理想情况下,这应该是我们自定义的 Error Attributes 类。然后,我们清楚地表明我们想要将所有错误处理请求路由到 renderErrorResponse() 方法。最后,我们获取错误属性并将它们插入服务器响应主体中。

然后,生成一个 JSON 响应,其中包含错误,HTTP 状态和计算机客户端异常消息的详细信息。对于浏览器客户端,它有一个 whitelabel 错误处理程序,它以 HTML 格式呈现相同的数据。其中的响应信息我们可以根据自己的需要进行定制。

参考资料

  • Handling Errors in Spring WebFlux

详解 AbstractErrorWebExceptionHandler 类在 WebFlux 全局异常处理中的使用

: » 详解 AbstractErrorWebExceptionHandler 类在 WebFlux 全局异常处理中的使用

原创文章,作者:506227337,如若转载,请注明出处:https://blog.ytso.com/251982.html

(0)
上一篇 2022年5月3日
下一篇 2022年5月3日

相关推荐

发表回复

登录后才能评论