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

JAVA herman 1305浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

看过源码的都知道,所有的框架基本上都会给你提供多条路,多个实现方式。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 格式呈现相同的数据。其中的响应信息我们可以根据自己的需要进行定制。

参考资料

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 详解 AbstractErrorWebExceptionHandler 类在 WebFlux 全局异常处理中的使用