(九)springboot实战——springboot3下的webflux项目参数验证及其全局参数验证异常处理

前言

在上一节内容中,我们介绍了如何在webflux项目中自定义实现一个全局的异常处理器ErrorWebExceptionHandler,正常情况下其可以处理我们系统的运行时异常,但是无法处理参数验证的异常WebExchangeBindException,所以这里提供另外的全局异常处理方式,通过注解@ExceptionHandler实现参数验证的全局异常处理。

本节内容主要是实现webflux项目集成spring-boot-starter-validation验证框架,完成请求接口参数的后台验证,实现接口请求参数的统一验证处理,返回统一的响应数据格式。

正文

①引入请求参数验证框架spring-boot-starter-validation

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>

 ②创建全局的参数验证异常处理器GlobalExceptionHandler

package com.yundi.atp.exception;import com.yundi.atp.common.ApiResponse;
import com.yundi.atp.common.ErrorCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.bind.support.WebExchangeBindException;
import reactor.core.publisher.Mono;import java.util.List;@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {/*** 参数验证异常** @param ex* @return*/@ExceptionHandler(WebExchangeBindException.class)public Mono<ApiResponse> handleWebExchangeBindException(WebExchangeBindException ex) {log.info("参数验证异常:" + ex);// 处理绑定异常BindingResult result = ex.getBindingResult();List<FieldError> fieldErrors = result.getFieldErrors();return Mono.just(ApiResponse.fail(ErrorCode.WEB_EXCHANGE_BIND_ERROR.getCode(), fieldErrors.get(0).getDefaultMessage()));}/*** 数学计算异常** @param ex* @return*/@ExceptionHandler(ArithmeticException.class)public Mono<ApiResponse> handleArithmeticException(ArithmeticException ex) {log.info("数学计算异常:" + ex);return Mono.just(ApiResponse.fail(ErrorCode.ARITHMETIC_ERROR.getCode(), ErrorCode.ARITHMETIC_ERROR.getMsg()));}/*** 自定义异常** @param ex* @return*/@ExceptionHandler(MyException.class)public Mono<ApiResponse> handleMyException(MyException ex) {log.info("自定义异常:" + ex);return Mono.just(ApiResponse.fail(ex.getCode(), ex.getMessage()));}/*** 兜底异常** @param ex* @return*/@ExceptionHandler(Exception.class)public Mono<ApiResponse> handleMyException(Exception ex) {log.info("系统异常:" + ex);return Mono.just(ApiResponse.fail(ErrorCode.SYSTEM_ERROR.getCode(), ErrorCode.SYSTEM_ERROR.getMsg()));}
}

③ ErrorCode统一定义错误码,方便根据相关错误码处理业务

package com.yundi.atp.common;public enum ErrorCode {SYSTEM_ERROR(10000, "系统错误!"),ARITHMETIC_ERROR(10001, "数学计算异常!"),WEB_EXCHANGE_BIND_ERROR(10002, "参数验证异常!"),;private Integer code;private String msg;ErrorCode(Integer code, String message) {this.code = code;this.msg = message;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}
}

 ④以新增用户数据为例,增加用户数据的验证

package com.yundi.atp.entity;import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Table;@Schema(name = "User", description = "用户类")
@Table(name = "user")
@Data
public class User {@Id@Schema(name = "id", description = "用户ID")private Integer id;@NotBlank(message = "用户名称不得为空!")@Schema(name = "name", description = "用户名称")private String name;@NotNull(message = "用户年龄不得为空!")@Schema(name = "age", description = "用户年龄")private Integer age;
}

 ⑤在保存用户请求接口中使用@Valid注解,开启请求参数验证

⑥ 启动webflux应用,使用swagger工具测试保存用户接口,验证参数注解生效,并按照统一响应格式返回了数据

⑦ 验证用户年龄的参数不为空

⑧ swagger需要使用专属webflux的springdoc-openapi-starter-webflux-ui启动器

<!-- https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webflux-ui -->
<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webflux-ui</artifactId><version>2.3.0</version>
</dependency>

结语

关于webflux项目的请求参数验证,以及统一的参数验证异常处理的内容到这里就结束了,我们下期见。。。

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

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

相关文章

Nodejs前端学习Day3_准备工作

妈的&#xff0c;这几天真tm冷&#xff0c;前天上午还下了一整天的雪&#xff0c;大雪 文章目录 前言一、Node.js简介1.1何为1.2有什么 二、Node.js可以做什么三、学习路线四、下载nodejs4.1小坑记录4.2LTS和Current版本的不同 五、什么是终端六、在nodejs中执行js代码七、powe…

Linux使用匿名管道实现进程池得以高效通信

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;Nonsense—Sabrina Carpenter 0:50━━━━━━️&#x1f49f;──────── 2:43 &#x1f504; ◀️ ⏸ ▶️ …

ubuntu 22.04 安装mysql-8.0.34

ubuntu 22.04 安装mysql-8.0.34 1、基础安装配置 更新软件包&#xff1a; sudo apt update查看可用软件包&#xff1a; sudo apt search mysql-server安装最新版本&#xff1a; sudo apt install -y mysql-server或者&#xff0c;安装指定版本&#xff1a; sudo apt inst…

如何实现无公网ip远程SSH连接家中本地的树莓派

文章目录 如何通过 SSH 连接到树莓派步骤1. 在 Raspberry Pi 上启用 SSH步骤2. 查找树莓派的 IP 地址步骤3. SSH 到你的树莓派步骤 4. 在任何地点访问家中的树莓派4.1 安装 Cpolar4.2 cpolar进行token认证4.3 配置cpolar服务开机自启动4.4 查看映射到公网的隧道地址4.5 ssh公网…

qemu + vscode图形化调试linux kernel

一、背景 使用命令行连接gdb 在调试时&#xff0c;虽然可以通过tui enable 显示源码&#xff0c;但还是存在设置断点麻烦&#xff08;需要对着源码设置&#xff09;&#xff0c;terminal显示代码不方便&#xff0c;不利于我们学习&#xff1b;另外在gdb 下p命令显示结构体内容…

【command】使用nr简化npm run命令

参考文章 添加 alias nrnpm run通过alias启动命令可以帮助我们节省运行项目输入命令的时间 $ cd ~ $ vim .bash_profile $ source ~/.bashrc

ChatGPT与文心一言:智能回复与语言准确性的较量

在当今数字化时代&#xff0c;随着人们对智能化技术的需求不断增长&#xff0c;智能回复工具也成为了日常生活中不可或缺的一部分。ChatGPT和文心一言作为两个备受瞩目的智能回复工具&#xff0c;在智能回复、语言准确性以及知识库丰富度等方面各有卓越之处。 本文将对这两者进…

14.5 Flash查询和添加数据库数据

14.5 Flash查询和添加数据库数据 在Flash与数据库通讯的实际应用中&#xff0c;如何实现用户的登录与注册是经常遇到的一个问题。登录实际上就是ASP根据Flash提供的数据查询数据库的过程&#xff0c;而注册则是ASP将Flash提供的数据写入数据库的过程。 1.启动Access2003&…

LeetCode 热题 100 | 子串

目录 1 560. 和为 K 的子数组 2 239. 滑动窗口最大值 3 76. 最小覆盖子串 菜鸟做题第二周&#xff0c;语言是 C 1 560. 和为 K 的子数组 题眼&#xff1a;“子数组是数组中元素的连续非空序列。” 解决本问题的关键就在于如何翻译问题。子数组 s 的和可以看作数组 i 的…

C++ 类与对象(上)

目录 本节目标 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 4.1 访问限定符 4.2 封装 5. 类的作用域 6. 类的实例化 7.类对象模型 7.1 如何计算类对象的大小 7.2 类对象的存储方式猜测 7.3 结构体内存对齐规则 8.this指针 8.1 thi…

Swift 周报 第四十六期

文章目录 前言卖不动了&#xff1f;iPhone 15 系列跌破 5000 元大关StoreKit 和审核指南更新将你的 App 提交到 Apple Vision Pro 的 App Store 提案通过的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组整理周报的第四十六期&#xff0c;每个模块已初步成…

用C语言实现贪吃蛇游戏!!!

前言 大家好呀&#xff0c;我是Humble&#xff0c;不知不觉在CSND分享自己学过的C语言知识已经有三个多月了&#xff0c;从开始的C语言常见语法概念说到C语言的数据结构今天用C语言实现贪吃蛇已经有30余篇博客的内容&#xff0c;也希望这些内容可以帮助到各位正在阅读的小伙伴…

Spark3内核源码与优化

文章目录 一、Spark内核原理1、Spark 内核概述1.1 简介1.2 Spark 核心组件1.3 Spark 通用运行流程概述 2、Spark 部署模式2.1 YARN Cluster 模式(重点)2.2 YARN Client 模式2.3 Standalone Cluster 模式2.4 Standalone Client 模式 3、Spark 通讯架构3.1 Spark 通信架构概述3.2…

Springboot响应数据详解

功能接口 Controller下每一个暴露在外的方法都是一个功能接口 功能接口的请求路径是RequestMapping定义的路径&#xff0c;浏览器需要请求该功能则需要发出该路径下的请求。 RestController RestControllerControllerResponseBody(响应数据的注解) ResponseBody 类型&#…

视频号下载提取器:如何轻松获取视频号的视频

在数字化的世界中&#xff0c;我们每天重复刷着形形色色的短视频&#xff0c;你们知道他们每天接收到的媒体内容就是经过不断的处理和编辑呈现在我们观看的产物。 其中&#xff0c;视频内容由于其生动形象的表现形式&#xff0c;已经成为人们获取信息、娱乐和学习的重要途径。然…

[GXYCTF2019]BabyUpload1

尝试各种文件&#xff0c;黑名单过滤后缀ph&#xff0c;content-type限制image/jpeg 内容过滤<?&#xff0c;木马改用<script languagephp>eval($_POST[cmdjs]);</script> 上传.htaccess将上传的文件当作php解析 蚁剑连接得到flag

城市开发区视频系统建设方案:打造视频基座、加强图像数据治理

一、背景需求 随着城市建设的步伐日益加快&#xff0c;开发区已经成为了我国工业化、城镇化和对外开放的重要载体。自贸区、开发区和产业园的管理工作自然也变得至关重要。在城市经开区的展览展示馆、进出口商品展示交易中心等地&#xff0c;数千路监控摄像头遍布各角落&#…

嵌入式第十二天!(指针数组、指针和二维数组的关系、二级指针)

1. 指针数组&#xff1a; int *a[5]; char *str[5]; 指针数组主要用来操作字符串数组&#xff0c;通常将指针数组的每个元素存放字符串的首地址实现对多个字符串的操作。 二维数组主要用来存储字符串数组&#xff0c;通过每行存储一个字符串&#xff0c;多行存储多个字符串所组…

Phoncent博客GPT写作工具

对于许多人来说&#xff0c;写作并不是一件轻松的事情。有时候&#xff0c;我们可能会遇到写作灵感枯竭、写作思路混乱、语言表达困难等问题。为了解决这些问题&#xff0c;Phoncent博客推出了一款创新的工具——GPT写作工具&#xff0c;它利用了GPT技术&#xff0c;为用户提供…

linux安装docker-compose

前言 如果你的docker版本是23&#xff0c;请移步到linux安装新版docker&#xff08;23&#xff09;和docker-compose这篇博客 查看docker版本命令&#xff1a; docker --version今天安装docker-compose的时候&#xff0c;找了很多教程&#xff0c;但是本地一直报错&#xff0…