摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢!java
本文内容react
摘录:只有不断培养好习惯,同时不断打破坏习惯,咱们的行为举止才可以自始至终都是正确的。git
先后端分离开发,通常提供 REST API,正常返回会有响应体,异常状况下会有对应的错误码响应。github
挺多人咨询的,Spring Boot MVC 异常处理用切面 @RestControllerAdvice
注解去实现去全局异常处理。那 WebFlux 如何处理异常?如何实现统一错误码异常处理?web
全局异常处理的好处:spring
下面介绍如何统一拦截异常,进行响应处理。后端
工程结构:浏览器
application.properties 无须配置,默认便可
Application Spring Boot 应用启动类,是能够用来启动 Spring Boot 应用。其包含了 @SpringBootApplication 注解和 SpringApplication 类,并调用 SpringApplication 类的 run() 方法,就能够启动该应用。springboot
具体实现类的关系图以下:服务器
城市路由器代码以下:
RouterFunctions 对请求路由处理类,即将请求路由处处理器,这将一个 GET 请求 /hello 路由处处理器 cityHandler 的 helloCity 方法上。跟 Spring MVC 模式下的 HandleMapping 相似。
RouterFunctions.route(RequestPredicate, HandlerFunction) 方法,对应的 参是请求参数和处理函数,若是请求匹配,就调 对应的处理器函数。
城市服务器处理类,代码以下:
Mono:实现发布者,并返回 0 或 1 个元素,即单对象。Mono 是响应流 Publisher 具备基础 rx 操做符。能够成功发布元素或者错误。用 Mono 做为返回对象,是由于返回包含了一个 ServerResponse 对象,而不是多个元素。
ServerResponse 是对响应的封装,能够设置响应状态,响应头,响应正文。好比 ok 表明的是 200 响应码、MediaType 枚举是表明这文本内容类型、返回的是 String 的对象。
ServerRequest 是对请求的封装。从请求中拿出 city 的值,若是没有的话则抛出对应的异常。GlobalException 是封装的全局异常。
Mono.justOrEmpty():从一个 Optional 对象或 null 对象中建立 Mono。
如图:
GlobalException 全局异常类,代码以下:
GlobalErrorAttributes 全局异常属性值类,代码以下:
重写了父类 DefaultErrorAttributes 默认错误属性类的 getErrorAttributes 获取错误属性方法,从服务请求封装 ServerRequest 中获取对应的异常。
而后判断是不是 GlobalException,若是是 CityHandler 服务处理类抛出的 GlobalException,则返回对应的异常的信息。
GlobalErrorWebExceptionHandler 全局异常处理类,代码以下:
代码解析以下:
到此基本结束。Spring Boot MVC 错误码如何实战,参考地址:https://www.bysocket.com/archives/1692
在 IDEA 中执行 Application
类启动,任意正常模式或者 Debug 模式。而后打开浏览器访问:
异常界面以下:
可见,这是在 CityHandler 城市服务处理类逻辑中抛出的全局异常信息。那么正常状况会是如何?
改下 URL ,访问以下:
正常界面以下:
在 Spring 框架中没有表明错误响应的类,只是返回响应对象,一个 Map。若是须要定义业务的错误码返回体,参考错误码如何实战,参考地址:https://www.bysocket.com/archives/1692。
本文重点仍是有别于 Spring Boot 传统 MVC 模式统一异常处理,实战了 WebFlux 全局异常处理机制。实战中这块扩展须要考虑:
本文示例读者能够经过查看下面仓库的中的模块工程名: 2-x-spring-boot-webflux-handling-errors:
若是您对这些感兴趣,欢迎 star、follow、收藏、转发给予支持!
(关注微信公众号,领取 Java 精选干货学习资料)