Spring Boot 2.x 系列教程:WebFlux REST API 全局异常处理 Error Handling
- 时间:
- 浏览:13
- 来源:3分时时彩官网_3分时时彩网站_去哪玩3分时时彩
摘要: 原创出处 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 对请求路由解决类,即将请求路由到解决器,这将另另另1个多 GET 请求 /hello 路由到解决器 cityHandler 的 helloCity 最好的土办法 上。跟 Spring MVC 模式下的 HandleMapping 类似于。
RouterFunctions.route(RequestPredicate, HandlerFunction) 最好的土办法 ,对应的 参是请求参数和解决函数,如果请求匹配,就调 对应的解决器函数。
2.3 CityHandler 服务解决类
城市服务器解决类,代码如下:
Mono:实现发布者,并返回 0 或 1 个元素,即单对象。Mono 是响应流 Publisher 具有基础 rx 操作符。后会 成功发布元素如果错误。用 Mono 作为返回对象,是如果返回含晒 了另另另1个多 ServerResponse 对象,而都不 多个元素。
ServerResponse 是对响应的封装,后会 设置响应状况,响应头,响应正文。比如 ok 代表的是 50 响应码、MediaType 枚举是代表这文本内容类型、返回的是 String 的对象。
ServerRequest 是对请求的封装。从请求中背熟 city 的值,如果没有语录则抛出对应的异常。GlobalException 是封装的全局异常。
Mono.justOrEmpty():从另另另1个多 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 框架中没有代表错误响应的类,却说返回响应对象,另另另1个多 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 精选干货学习资料)