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

  • 时间:
  • 浏览:0
  • 来源:大发时时彩_时时彩全天计划_大发时时彩全天计划

摘要: 原创出处 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 对请求路由避免类,即将请求路由到避免器,这将有一个 GET 请求 /hello 路由到避免器 cityHandler 的 helloCity 辦法 上。跟 Spring MVC 模式下的 HandleMapping 类似。

RouterFunctions.route(RequestPredicate, HandlerFunction) 辦法 ,对应的 参是请求参数和避免函数,时候 请求匹配,就调 对应的避免器函数。

2.3 CityHandler 服务避免类

城市服务器避免类,代码如下:

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

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

ServerRequest 是对请求的封装。从请求中搞懂 city 的值,时候 如此 一句话则抛出对应的异常。GlobalException 是封装的全局异常。

Mono.justOrEmpty():从有一个 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 框架中如此 代表错误响应的类,时候 我返回响应对象,有一个 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/250
  • 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/250

 

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