WebFlux 的全局异常处理 DefaultErrorAttributes 详解

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

上一章我们用 onErrorResume 和 onErrorReturn 来处理 WebFlux 中的异常,但是这种处理方式效率不高,只能针对具体的方法。那么有没有和 SpringMVC 中的 @ControllerAdvice、@RestControllerAdvice 等相同功能的全局异常处理呢?

明确的告诉你,有!本文我们一起先来学习一个简单的吧!

先新建一个 XttblogRoute 类。

@Configuration
public class XttblogRoute {
    @Bean
    public RouterFunction<ServerResponse> xttblog() {
        return route(GET("/xttblog"), req -> {
            String param = req.queryParam("test").orElse(null);
            if(null == param){
                throw new XttblogException("www.xttblog.com 888");
            }
            return Mono.just("https://www.xttblog.com " + param).flatMap(s -> ServerResponse.ok()
                    .contentType(MediaType.TEXT_PLAIN).syncBody(s));
        });
    }
}

为了演示效果,我自定义一个异常处理类 XttblogException。

public class XttblogException extends RuntimeException{
    private int code = 0;
    private String msg = "";
    public XttblogException() {
        super();
    }
    public XttblogException(String msg) {
        super(msg);
        this.msg = msg;
    }
    public XttblogException(int code, String msg) {
        super(msg);
        this.code = code;
        this.msg = msg;
    }
    // 省略其他 get/set 方法
}

然后全局异常处理,我们要借助 DefaultErrorAttributes 实现。DefaultErrorAttributes 是一个抽象类,在 SpringBoot 的 reactive 包中。

@Component
public class GlobalErrorAttributes extends DefaultErrorAttributes {
    public GlobalErrorAttributes() {
        super(false);
    }
    @Override
    public Map<String, Object> getErrorAttributes(ServerRequest request,
            boolean includeStackTrace) {
        Map<String, Object> errorAttributes = super.getErrorAttributes(
                request, includeStackTrace);
        Throwable error = getError(request);
        if (error instanceof XttblogException) {
            errorAttributes.put("code", ((XttblogException) error).getCode());
            errorAttributes.put("data", error.getMessage());
        } else {
            // 自定义一个 666
            errorAttributes.put("code", 666);
            errorAttributes.put("data", "www.xttblog.com ERROR");
        }
        return errorAttributes;
    }
}

如果有多个 DefaultErrorAttributes 实现。可以使用 @Order() 来定义优先级。

启动类的代码和上一章中的相同,我就不在粘贴了。

项目启动后,我们在浏览器里请求 http://localhost:8080/xttblog,就会发生异常,被我们自定义的全局异常处理所拦截,返回 www.xttblog.com 888!如果请求中带有参数,类似这样:http://localhost:8080/xttblog?test=other 的正常请求,将返回正常的响应。

为了节约时间,运行效果我就不截图了,关于本博客的所有 WebFlux 教程源码,都可以在我的微信公众号里进行下载,回复”webflux“关键字即可!

业余草公众号

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

本文原文出处:业余草: » WebFlux 的全局异常处理 DefaultErrorAttributes 详解