(九)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.hqwc.cn/news/439638.html

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

相关文章

防火墙到防火墙的高可用知识汇总

目录​​​​​​​ 防火墙 防火墙的分类&#xff1a; 防火墙的发展史 传统防火墙&#xff08;包过滤防火墙&#xff09;—— 一个严格的规则表 传统防火墙&#xff08;应用代理防火墙&#xff09;—— 每个应用添加代理 传统防火墙&#xff08;状态检测防火墙&#xff09…

宝塔控制面板配置SSL证书实现网站HTTPS

宝塔安装SSL证书提前申请好SSL证书&#xff0c;如果还没有&#xff0c;先去Gworg里面申请&#xff0c;一般几分钟就可以下来&#xff0c;申请地址&#xff1a;首页-Gworg官方店-淘宝网 一、登录邮箱下载&#xff1a;Gworg证书文件目录 &#xff0c;都会有以下五个文件夹。宝塔…

IBOS代码审计流程-文件上传(超详细)

2.对源代码进行SeayDzend解密 因为在我们打开文件时会有一部分会出现代码是乱码的情况 C:\Users\gaolitao\IBOS\WWW\system\defines 因此我们需要在该源代码的基础上进行解密&#xff0c;这样才能更好的进行代码审计 这里正确填写Zend5.3的加密方式对其进行解密 将解密后的代…

欧拉计划第816题:求大量点的最短距离

本次来解决欧拉计划的第816题: 解: 第一步:最原始的算法 先从简单的情况开始,即原题里的14个点的情况 import mathdef gen_points(n):s = [0] * (2*n)s[0] = 290797for i in range(1, 2*n):s[i] = (s[i - 1] * s[i - 1]) % 50515093p = [(s[2 * i], s[2 * i + 1]) for…

H5 嵌套iframe并设置全屏

H5 嵌套iframe并设置全屏 上图上代码 <template><view class"mp-large-screen-box"><view class"mp-large-screen-count">// 返回按钮<view class"mp-mini-btn-color mp-box-count" hover-class"mp-mini-btn-hover…

PGsql 解析json及json数组

创建测试数据 drop table if exists json_test; create table json_test as select 111 as id, {"nodes":{"1692328028076":{"nodeId":"1692328028076","nodeName":"测试表1","nodeType":"DATACO…

如何在群晖中本地部署WPS Office并实现公网远程访问

文章目录 1. 拉取WPS Office镜像2. 运行WPS Office镜像容器3. 本地访问WPS Office4. 群晖安装Cpolar5. 配置WPS Office远程地址6. 远程访问WPS Office小结 7. 固定公网地址 wps-office是一个在Linux服务器上部署WPS Office的镜像。它基于WPS Office的Linux版本&#xff0c;通过…

ArcGIS Pro 如何计算长度和面积等数据?

要素的几何属性属于比较重要的信息&#xff0c;作为一款专业的GIS软件&#xff0c;ArcGIS Pro自然也是带有计算几何的功能&#xff0c;这里为大家介绍一下计算方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的矢量数据&#xff0c;除了矢…

Hana SQL+正则表达式

目录 一、Pre 前言 二、知识点拆解 1&#xff09;case when…then…else 2&#xff09;json_value 函数 拓展资料 3&#xff09;CAST 函数 拓展资料 4) ROUND 函数 5&#xff09;occurences_regexpr 函数 拓展资料 6&#xff09;正则表达式 拓展资料 三、整合分析…

设计模式——2_0 职责链(Chain of Responsibility)

楼下一个男人并得要死&#xff0c;那家隔壁的一家唱着留声机&#xff0c;对面是弄孩子。楼上有两人狂笑&#xff1b;还有打牌声&#xff0c;河中的船上有女人哭她死去的母亲。人类的悲欢并不相通&#xff0c;我只觉得他们吵闹 ——鲁迅 文章目录 定义图纸一个例子&#xff1a;如…

SQL Server ISO镜像文件安装

参考&#xff1a;Sql Server ISO镜像文件安装指南_sqlserveriso文件怎么安装-CSDN博客 参考文件中的步骤基本相同&#xff0c;注意两点 1、尽量安装在D盘&#xff0c;有些组件默认必须安装在C盘&#xff0c;有些会报没有目录的情况 需要在D盘创建目录。 2、我没有windows本地…

都说在边缘落地视频智能分析难,但是这次有了大模型!

百度智能云边缘计算团队成功地将大模型、业务场景、边缘设备进行融合&#xff0c;使得边缘服务器 ECS上的算子具备了「场景自适应能力」&#xff0c;并实现了「采集 - 清洗 - 标注 - 训练 - 部署 - 迭代」全流程的自动化。 在视频智能分析场景中&#xff0c;研发人员使用少量业…