Spring Boot 2.x 系列教程:WebFlux REST API 全局异常处理 Error Handling

  • 时间:
  • 浏览:63

摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢!

本文内容

  • 为哪几个要全局异常正确处理?
  • WebFlux REST 全局异常正确处理实战
  • 小结

摘录:不在 不断培养好习惯,一起去不断打破坏习惯,大伙的行为举止才后要 自始至终全部后要正确的。

一、为哪几个要全局异常正确处理?

前后端分失去发,一般提供 REST API,正常返后要有响应体,异常情况报告下会有对应的错误码响应。

挺多人咨询的,Spring Boot MVC 异常正确处理用切面 @RestControllerAdvice 注解去实现去全局异常正确处理。那 WebFlux 怎么才能 才能 正确处理异常?怎么才能 才能 实现统一错误码异常正确处理?

全局异常正确处理的好处:

  • 异常错误码等统一维护
  • 正确处理某些重复代码

二、WebFlux REST 全局异常正确处理实战

下面介绍怎么才能 才能 统一拦截异常,进行响应正确处理。

2.1 工程信息

  • 运行环境:JDK 7 或 8,Maven 3.0+
  • 技术栈:SpringBoot 2.1.3
  • 代码地址:https://github.com/JeffLi1993/springboot-learning-example
  • 模块工程名: 2-x-spring-boot-webflux-handling-errors

工程形态学 :

application.properties 未必配置,默认即可

Application Spring Boot 应用启动类,是能不在 用来启动 Spring Boot 应用。其蕴藏了 @SpringBootApplication 注解和 SpringApplication 类,并调用 SpringApplication 类的 run() 方法,就能不在 启动该应用。

具体实现类的关系图如下:

2.2 CityRouter 路由器类

城市路由器代码如下:

RouterFunctions 对请求路由正确处理类,即将请求路由到正确处理器,这将有一4个 多多 GET 请求 /hello 路由到正确处理器 cityHandler 的 helloCity 方法上。跟 Spring MVC 模式下的 HandleMapping 例如。

RouterFunctions.route(RequestPredicate, HandlerFunction) 方法,对应的 参是请求参数和正确处理函数,不可能 请求匹配,就调 对应的正确处理器函数。

2.3 CityHandler 服务正确处理类

城市服务器正确处理类,代码如下:

Mono:实现发布者,并返回 0 或 1 个元素,即单对象。Mono 是响应流 Publisher 具有基础 rx 操作符。能不在 成功发布元素不可能 错误。用 Mono 作为返回对象,是不可能 返回蕴藏了有一4个 多多 ServerResponse 对象,而全部后要多个元素。

ServerResponse 是对响应的封装,能不在 设置响应情况报告,响应头,响应正文。比如 ok 代表的是 100 响应码、MediaType 枚举是代表这文本内容类型、返回的是 String 的对象。

ServerRequest 是对请求的封装。从请求中玩转信用卡 city 的值,不可能 不在 一句话则抛出对应的异常。GlobalException 是封装的全局异常。

Mono.justOrEmpty():从有一4个 多多 Optional 对象或 null 对象中创建 Mono。

2.4 GlobalError 正确处理类

如图:

GlobalException 全局异常类,代码如下:

GlobalErrorAttributes 全局异常属性值类,代码如下:

重写了父类 DefaultErrorAttributes 默认错误属性类的 getErrorAttributes 获取错误属性方法,从服务请求封装 ServerRequest 中获取对应的异常。

而且判断与否 GlobalException,不可能 是 CityHandler 服务正确处理类抛出的 GlobalException,则返回对应的异常的信息。

GlobalErrorWebExceptionHandler 全局异常正确处理类,代码如下:

代码解析如下:

  • AbstractErrorWebExceptionHandler 抽象类是用来正确处理全局错误时进行扩展和实现
  • @Order 注解标记 AspectJ 的切面排序,值越小拥有越高的优先级,这里设置优先级偏高。
  • 构造函数将 GlobalErrorAttributes 全局异常属性值类设置到 AbstractErrorWebExceptionHandler 抽象类的局部变量中。
  • 重写 getRoutingFunction 方法,设置对应的 RequestPredicates 和 Mono 服务响应对象
  • 将 GlobalErrorAttributes 的全局异常属性值 map,设置到新的 ServerResponse 即可。

到此基本开使英文英文。Spring Boot MVC 错误码怎么才能 才能 实战,参考地址:https://www.bysocket.com/archives/1692

2.5 运行验证

在 IDEA 中执行 Application 类启动,任意正常模式不可能 Debug 模式。而且打开浏览器访问:

异常界面如下:

可见,这是在 CityHandler 城市服务正确处理类逻辑中抛出的全局异常信息。不在 正常情况报告会是怎么才能 才能 ?

改下 URL ,访问如下:

正常界面如下:

三、小结

在 Spring 框架中不在 代表错误响应的类,却说 我返回响应对象,有一4个 多多 Map。不可能 后要 定义业务的错误码返回体,参考错误码怎么才能 才能 实战,参考地址:https://www.bysocket.com/archives/1692。

本文重点还是有别于 Spring Boot 传统 MVC 模式统一异常正确处理,实战了 WebFlux 全局异常正确处理机制。实战中这块扩展后要 考虑:

  • 异常分层,从基类中扩展出来
  • 错误码设计分层,易扩展,比如在错误码中新增调用量字段…

代码示例

本文示例读者能不在 通过查看下面仓库的中的模块工程名: 2-x-spring-boot-webflux-handling-errors:

  • Github:https://github.com/JeffLi1993/springboot-learning-example
  • Gitee:https://gitee.com/jeff1993/springboot-learning-example

不可能 您对哪几个感兴趣,欢迎 star、follow、收藏、转发给予支持!

参考资料

  • WebFlux REST API 全局异常正确处理:https://www.bysocket.com/archives/2100
  • https://dzone.com/articles/exception-handling-in-spring-boot-webflux-reactive

以下专题教程跟我说您会有兴趣

  • 《Spring Boot 2.x 系列教程》 https://www.bysocket.com/springboot
  • 《Java 核心系列教程》 https://www.bysocket.com/archives/2100

 

(关注微信公众号,领取 Java 精选干货学习资料)