(八)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.mzph.cn/news/650692.shtml

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

相关文章

[SWPUCTF 2018]SimplePHP1

打开环境 有查看文件跟上传文件&#xff0c;查看文件里面显示没有文件url貌似可以文件读取 上传文件里面可以上传文件。 先看一下可不可以文件读取 /etc/passwd不能读取&#xff0c;源码提示flag在f1ag.php 看看能不能读取当前的文件&#xff0c; 先把代码摘下来 file.php …

JavaScript 之 作用域变量提升闭包

一、JavaScript 代码的执行 浏览器内核是由两部分组成的&#xff0c;以 webkit 为例 WebCore&#xff1a;负责HTML解析、布局、渲染等等相关的工作JavaScriptCore&#xff1a;解析、执行 JavaScript 代码 另外一个强大的 JavaScript 引擎就是 V8 引擎 二、深入 V8 引擎原理 …

Java面向对象三大特征之多态

在之前的文章&#xff0c;我们分别介绍了类与对象、面向对象三大特征的封装、以及继承&#xff08;一&#xff09;、继承&#xff08;二&#xff09;。这一篇文章&#xff0c;我们介绍Java面向对象三大特征的最后一个——多态。 多态 多态的概述 概念&#xff1a;完成某个行为…

前端工程化之:webpack1-1(构建工具)

一、浏览器端的模块化 1.问题 效率问题&#xff1a;精细的模块划分带来了更多的 JS 文件&#xff0c;更多的 JS 文件带来了更多的请求&#xff0c;降低了页面访问效率&#xff1b;兼容性问题&#xff1a;浏览器目前仅支持 ES6 的模块化标准&#xff0c;并且还存在兼容性问题&…

Hive之set参数大全-17

配置是否启用 HiveServer2 的 Web 用户界面&#xff08;WebUI&#xff09;中的跨源资源共享&#xff08;CORS&#xff09; 在 Hive 中&#xff0c;hive.server2.webui.enable.cors 是一个参数&#xff0c;用于配置是否启用 HiveServer2 的 Web 用户界面&#xff08;WebUI&…

CVE-2024-23897 Jenkins 任意文件读取漏洞

项目介绍 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。Jenkins是开源CI&CD软件领导者&#xff0c; 提供超过1000个插…

Java集合相关面试题

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于java面试题系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基…

C# 设置一个定时器函数

C#中&#xff0c;创建设置一个定时器&#xff0c;能够定时中断执行特定操作&#xff0c;可以用于发送心跳、正计时和倒计时等。 本文对C#的定时器简单封装一下&#xff0c;哎&#xff0c;以方便定时器的创建。 定义 using Timer System.Timers.Timer;class SetTimer {Timer …

Nacos注册中心:揭秘分布式系统的灵魂之所

目录 一、Nacos注册中心简介 1.1 概述 1.2 作用和意义 二、Nacos的特点和优势

OSPF协议基础(OSPF工作过程)

目录 OSPF基本工作原理邻居建立过程Router ID发现并建立邻居 - Hello报文OSPF邻居建立过程 链路状态信息丰富的数据链路层支持能力网络类型 - P2P网络网络类型 - 广播型网络网络类型 - NBMA网络网络类型 - P2MP网络OSPF的度量方式 报文类型及作用OSPF协议报文头部OSPF报文类型O…

物理服务器

物理服务器 物理服务器是一种独立的、非虚拟化的计算机设备&#xff0c;它通常被用作高性能应用、数据库、存储和网络等关键业务应用的运行平台。物理服务器可以提供更高的处理能力、更好的安全性和可靠性&#xff0c;但需要用户自行维护和管理。 物理服务器的形式多种多样&…

图论-寒假

文章目录 A - Amusement Arcade题意&#xff1a;题解&#xff1a;代码&#xff1a; B - Brexiting and Brentering题意&#xff1a;题解&#xff1a;代码&#xff1a; I - Montys Hall题意&#xff1a;题解&#xff1a;代码&#xff1a; A - Amusement Arcade 题意&#xff1a…

每日一道编程题:回文数

题目 一串字符如果从左读和从右读完全相同&#xff0c;我们称之为回文。请判断键盘输入一串字符&#xff08;不超过1000位&#xff09;&#xff0c;是否是回文。是&#xff0c;则输出YES&#xff0c;否则输出NO。 输入样例 1aabbccbbaa1输出样例 YES代码 #include <bit…

k8s-调度

调度 从上面的架构图我们可以看到,调度是工作在Master,负责调度Pod&#xff0c;为POD分配Node。 调度的工作原理 #查看所有的Node kubectl get nodes 我们可以看到节点有一个Name,这就是调度的关键。 调度的步骤&#xff1a; 1 创建POD的时候每一个POD都会有一个叫NodeName的…

老板为何都对项目经理毕恭毕敬!因为这个职位一念成佛一念成魔

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 老板为何都对项目经理毕恭毕敬&#xff01;因为这个职位一念成佛一念成魔 曾几何时&am…

Linux:命名管道及其实现原理

文章目录 命名管道指令级命名管道代码级命名管道 本篇要引入的内容是命名管道 命名管道 前面的总结中已经搞定了匿名管道&#xff0c;但是匿名管道有一个很严重的问题&#xff0c;它只允许具有血缘关系的进程进行通信&#xff0c;那如果是两个不相关的进程进行通信&#xff0…

【最佳实践】Go 组合模式对业务解耦

在 Go 语言中&#xff0c;组合模式&#xff08;Composition&#xff09;是通过嵌入结构体&#xff08;embedding structs&#xff09;来实现的。它允许我们构建复杂的对象&#xff0c;通过将简单对象组合成树形结构来表示整个部分的层次结构。在 Go 中&#xff0c;这种模式不仅…

《佛法修学概要》009-012集研讨

课程摘要 9、只有走出心中的妄想&#xff0c;才可能接觸彌陀的光明&#xff01; 佛陀在經典裡講出一個譬喻&#xff0c;說有一座動物園&#xff0c;這座動物園關了很多動物。其中有一隻袋鼠&#xff0c;就是澳洲那種很會跳的袋鼠。動物園的管理員&#xff0c;給牠圈了一個十公尺…

《合成孔径雷达成像算法与实现》Figure5.16

clc clear close all距离向参数 R_eta_c 20e3; % 景中心斜距 Tr 25e-6; % 发射脉冲时宽 Kr 0.25e12; % 距离向调频率 Fr 7.5e6; % 距离向采样率 Nrg 256; % 距离线采样点数 Bw abs(Kr*Tr); …

uniapp+极光做消息推送

借鉴地址uniapp极光做消息推送_uniapp 极光 配置 ios 自定义消息-CSDN博客