(八)springboot实战——springboot3下的webflux项目全局异常处理

前言

在webflux响应式编程中,如何处理系统运行时异常是本节的主要内容。在传统的Servlet阻塞式web项目中主要通过HandlerExceptionResolver处理器来处理,而在webflux响应式web项目中,则是通过DispatchExceptionHandler异常处理器来处理异常。由于大量的异常可能在运行过程中产生,针对业务方法单个处理显然不是最优的选项。

本节内容主要是针对一些运行时异常,实现全局异常处理,包括一些业务异常,通过自定义异常,将异常抛出到最上层,使用全局的异常处理器处理,返回统一的异常格式。主要是通过实现ErrorWebExceptionHandler的handle方法实现。

正文

①创建一个数学异常,查看webflux项目默认的异常处理

@Operation(summary = "获取全部用户信息", description = "获取全部用户信息")
@GetMapping(value = "getAllUserInfo")
public Mono<ApiResponse<List<User>>> getAllUserInfo() {System.out.println(1 / 0);Flux<User> userInfo = userService.getAllUserInfo();return userInfo.collectList().map(user -> ApiResponse.success(user));
}

②使用swagger工具调用接口,查看异常返回结果,默认异常响应结果说明不够清晰

 ③创建一个全局异常处理器GlobalErrorWebExceptionHandler,并返回统一格式的异常响应结果,便于统一处理

package com.yundi.atp.exception;import com.fasterxml.jackson.databind.ObjectMapper;
import com.yundi.atp.common.ApiResponse;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Slf4j
@Component
public class GlobalErrorWebExceptionHandler implements ErrorWebExceptionHandler {@SneakyThrows@Overridepublic Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {log.info("ex:" + ex);// 1.创建一个响应对象ServerHttpResponse response = exchange.getResponse();HttpHeaders headers = response.getHeaders();headers.setContentType(MediaType.APPLICATION_JSON);// 2.根据不同的异常类型返回不同的错误信息和HTTP状态码if (ex instanceof ArithmeticException) {//2.1数学计算异常ApiResponse apiResponse = ApiResponse.fail(101, "数学计算异常!");byte[] bytes = new ObjectMapper().writeValueAsBytes(apiResponse);DataBuffer buffer = response.bufferFactory().wrap(bytes);return response.writeWith(Mono.just(buffer));} else {//2.2其它兜底异常ApiResponse apiResponse = ApiResponse.fail(111, "系统异常!");byte[] bytes = new ObjectMapper().writeValueAsBytes(apiResponse);DataBuffer buffer = response.bufferFactory().wrap(bytes);return response.writeWith(Mono.just(buffer));}}
}

PS:这里需要注意的是全局异常处理器要使用@Component注解,将处理器加入到spring的IOC容器中才能生效

 ④使用swagger工具调用接口,查看异常返回结果,验证是否按照统一响应格式要求返回

⑤ 除了一些计算异常,数据验证异常等,我们还可以有一类自定义的业务异常,也可以通过全局异常处理器处理,这里创建一个自定义的异常类MyException,并实现其一些构造方法,方遍调用

package com.yundi.atp.exception;import lombok.Data;@Data
public class MyException extends RuntimeException {private Integer code;public MyException(String msg) {super(msg);}public MyException(Integer code, String msg) {super(msg);this.code = code;}
}

⑥ 在全局异常处理器GlobalErrorWebExceptionHandler中增加自定义的异常处理

⑦ 使用自定义异常返回异常

 ⑧使用swagger工具调用接口,查看异常返回结果,验证是否按照统一响应格式要求返回自定义异常处理

⑨ 也可以根据项目的实际情况,增加其它异常处理,例如数据验证不通过的异常处理

结语

关于springboot3下的webflux项目全局异常处理的内容到这里就结束了,我们下期见。。。。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/434475.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hammer.js中文教程

一、什么是hammer.js hammerJS是一个开源的&#xff0c;轻量级的触屏设备javascript手势库&#xff0c;它可以在不需要依赖其他东西的情况下识别触摸&#xff0c;鼠标事件。允许同时监听多个手势、自定义识别器&#xff0c;也可以识别滑动方向。 优点&#xff1a; 为移动端网…

Wpf 使用 Prism 实战开发Day16

客户端使用RestSharp库调用WebApi 动态加载数据 在MyDoTo客户端中&#xff0c;使用NuGet 安装两个库 RestSharp Newtonsoft.Json 一. RestSharp 简单的使用测试例子 当前章节主要目的是&#xff1a;对RestSharp 库&#xff0c;根据项目需求再次进行封装。下面先做个简单的使用…

[SpingBoot] 3个扩展点

初始化器ApplicationContextInitializer监听器ApplicationListenerRunner: Runner的一般应用场景就是资源释放清理或者做注册中心, 因为执行到Runner的时候项目已经启动完毕了, 这个时候可以注册进注册中心。 文章目录 1.初始化器ApplicationContextInitializer2.监听器Applica…

系统架构设计师教程(十七)通信系统架构设计理论与实践

通信系统架构设计理论与实践 17.1 通信系统概述17.2 通信系统网络架构17.2.1局域网网络架构17.2.2 广域网网络架构17.2.3 移动通信网网络架构17.2.4存储网络架构17.2.5 软件定义网络架构17.3 网络构建关键技术17.3.1 网络高可用设计17.3.2 IPv4与IPv6融合组网技术17.3.3 SDN技术…

光明之盒:揭开可解释性人工智能的神秘面纱

在人工智能&#xff08;AI&#xff09;的日益普及之际&#xff0c;可解释性人工智能&#xff08;Explainable AI&#xff0c;简称XAI&#xff09;成为了桥接人机理解的关键技术。XAI不仅让人们窥视AI的内在工作原理&#xff0c;还能够提高我们对其决策过程的信任感。本文将深入…

物联网IOT: 风浆叶片拧紧装配及实时监测系统

某大型风电设备,通过机器人应用与精益化生产体系的融合,打造出行业领先的具备柔性生产能力的“脉动式”生产体系。同时在关键工序上。其中,在叶片装配等关键工序上使用由智能机器人代替人工,以提高生产的效率和装配质量可靠性,将六轴机器人、视觉系统、光电系统、液压、气动、伺…

仅使用 Python 创建的 Web 应用程序(前端版本)第08章_商品详细

在本章中,我们将实现一个产品详细信息页面。 完成后的图像如下。 Model、MockDB、Service都是在产品列表页实现的,所以创建步骤如下。 No分类内容1Page定义PageId并创建继承自BasePage的页面类2Application将页面 ID 和页面类对添加到 MultiPageApp 的页面中Page:定义PageI…

HbuilderX报错“Error: Fail to open IDE“,以及运行之后没有打开微信开发者,或者运行没有反应的解决办法

开始 问题:HbuilderX启动时,打开微信开发者工具报错"Error: Fail to open IDE",以及运行之后没有打开微信开发者,或者运行没有反应的解决办法! 解决办法: 按照步骤一步一步完成分析,除非代码报错,否则都是可以启动的 第一步:检查HbuildX是否登录账号 第二步:检查微信…

Stable Diffusion插件Recolor实现黑白照片上色

今天跟大家分享一个使用Recolor插件通过SD实现老旧照片轻松变彩色&#xff0c;Recolor翻译过来的含义就是重上色&#xff0c;该模型可以保持图片的构图&#xff0c;它只会负责上色&#xff0c;图片不会发生任何变化。 一&#xff1a;插件下载地址 https://github.com/pkuliyi…

机器学习 | 利用Pandas进入高级数据分析领域

目录 初识Pandas Pandas数据结构 基本数据操作 DataFrame运算 文件读取与存储 高级数据处理 初识Pandas Pandas是2008年WesMcKinney开发出的库&#xff0c;专门用于数据挖掘的开源python库&#xff0c;以Numpy为基础&#xff0c;借力Numpy模块在计算方面性能高的优势&am…

内网穿透natapp使用教程(Linux)

我的使用场景&#xff1a;在家访问学校服务器&#xff0c;由于不在一个局域网&#xff0c;所以需要使用内网穿透&#xff0c;我使用的是natapp。需要在有局域网的时候做好以下步骤。 &#xff08;natapp官网&#xff1a;https://natapp.cn/&#xff09; 1. 下载客户端 &#x…

Spring MVC 请求流程

SpringMVC 请求流程 一、DispatcherServlet 是一个 Servlet二、Spring MVC 的完整请求流程 Spring MVC 框架是基于 Servlet 技术的。以请求为驱动&#xff0c;围绕 Servlet 设计的。Spring MVC 处理用户请求与访问一个 Servlet 是类似的&#xff0c;请求发送给 Servlet&#xf…