Spring参数校验,数组入参校验 :List<E>

devtools/2025/1/22 3:44:25/

1、程序内直接校验

参数进入控制层方法,使用具体的参数方法来验证,灵活不优雅

Objects.isNull()
String.isEmpty()

2、验证 单对象(Obj)使用 @Validated

优雅,不灵活,对象类配置多

首先在对象类中
1、校验属性添加注解
2、添加校验分组

/*** @NotBlank 非nll 非空*/
@NotBlank(message = "name不能为空", groups = {InsertGroup.class})
private String name;/*** @NotNull 非空,这里是数组,不能要求非空字符串*/
@Transient
@NotNull(message = "Ids不能为空", groups = {InsertGroup.class})
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String[] Ids;/*** 设置不同分组,供给不同的严正要求*/
public interface InsertGroup {}

控制层使用@Validated验证

/*** @Validated(OamUpg.InsertGroup.class) 这具体验证分组*/
public AjaxResult insertTest(@Validated(TestObj.InsertGroup.class) @RequestBody TestObj obj)

经过这样设置就能在控制层对单对象的入参进行验参了

3、验证 数组对象(List)使用 @Validated+自定义工具类

首先确保单对象验证正确

Java对象

@Data
@TableName(value = "product")
@Validated
public class TheCommodity {@TableId(value = "id", type = IdType.AUTO)private Integer id;@TableField(value = "product_name")@NotBlank(message = "productName cannot be empty!",groups = {addOne.class})private String productName;@TableField(value = "product_count")@NotBlank(message = "productCount cannot be empty!",groups = {addOne.class})private String productCount;@JsonProperty("tenant_id")  // 显式指定 JSON 字段名为 tenant_id@TableField(value = "tenant_id")@NotNull(message = "Tenant ID cannot be null!",groups = {addOne.class})private Integer tenantId;public interface addOne{}
}

控制层

@PostMapping("/addOne")
public boolean addOne(@Validated(TheCommodity.addOne.class) @RequestBody TheCommodity product) {System.out.println("入参为 "+product.toString());return productService.save(product);
}

这个示例和2相同,通过@Validated 以及对象内部的判定注解,即可实现单对象的参数校验

现在自定义一个工具方法

import javax.validation.*;
import java.util.List;
import java.util.Set;public class ValidationUtil {private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();/*** 校验列表中的每个对象,并返回第一个校验失败的对象及错误信息** @param list 待校验的对象列表* @param group 校验分组* @param <T> 对象类型* @return 校验失败的对象字符串和错误信息,或 "200" 表示通过*/public static <T> String validateList(List<T> list, Class<?> group) {for (T item : list) {// 校验该对象Set<ConstraintViolation<T>> violations = validator.validate(item, group);// 如果校验失败,返回该对象的字符串打印和错误提示if (!violations.isEmpty()) {StringBuilder errorMessages = new StringBuilder();for (ConstraintViolation<T> violation : violations) {errorMessages.append(violation.getMessage()).append(", ");}// 返回对象的字符串打印和错误信息return "对象: " + item.toString() + " 错误: " + errorMessages.toString();}}return "200";  // 如果没有错误,返回 "200"}
}

批量操作时调用这个方法,通过向工具类传参,
1、入参list
2、验参分组

ValidationUtil.validateList(productList, TheCommodity.addOne.class);

控制层使用示例

@PostMapping("/addBatch")
public boolean addBatch(@RequestBody List<TheCommodity> productList) {// 调用通用工具方法进行校验String result = ValidationUtil.validateList(productList, TheCommodity.addOne.class);if (!result.equals("200")) {// 验参未通过,信息提示、记录等逻辑System.out.println(result);return false;}// 继续进行逻辑操作return true;
}

PS:这里我看了很多博客说使用@Valid 能递归到数组内,但是我各种尝试,始终没能验参成功。
所以这里暂时只能自己动手了,欢迎小伙伴们在评论区交流学习,指正错误。


http://www.ppmy.cn/devtools/152492.html

相关文章

kafka学习

kafka (消息、生产者、消费者、toptic、分区、偏移量、broker、集群) Kafka是什么&#xff1f; 学习Kafka的目的&#xff0c;为了解决高吞吐量项目的需求&#xff0c;Kafka号称大数据的杀手锏&#xff0c;这款为大数据而生的消息中间件&#xff0c;以其百亿级tps的吞吐量名声…

nacos安装及SpringCloud整合

参考资料: 参考视频 参考demo SpringCloud-Alibaba基础框架搭建 nacos官网 nacos部署教程: 1.准备环境 - 1.64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。 - 2.64 bit JDK 1.8+;下载 & 配置。 - 3.Maven 3.2.x+;下载 & 配置。 2.版本选…

Django多线程爬虫:突破数据抓取瓶颈

Django框架以其高效、安全、可扩展性强等特点&#xff0c;在Web开发领域得到了广泛应用。同时&#xff0c;Python语言的多线程支持和丰富的库也为开发多线程爬虫提供了便利。将Django与多线程技术相结合&#xff0c;不仅可以利用Django的强大功能进行项目管理和数据存储&#x…

HTML中相对路径和绝对路径详解

文章目录 HTML中相对路径和绝对路径详解一、引言二、绝对路径1、定义2、使用场景3、代码示例 三、相对路径1、定义2、使用方法3、代码示例 四、使用示例1、图片路径2、CSS和JavaScript文件路径3、页面内部链接 五、总结 HTML中相对路径和绝对路径详解 一、引言 在HTML开发中&a…

MySQL面试题2025 每日20道【其四】

1、你们生产环境的 MySQL 中使用了什么事务隔离级别&#xff1f;为什么&#xff1f; 中等 在生产环境中&#xff0c;MySQL数据库的事务隔离级别通常由开发团队或数据库管理员根据应用的需求来设定。MySQL支持四种标准的事务隔离级别&#xff1a; 读未提交&#xff08;Read Unc…

【useReducer Hook】集中式管理组件复杂状态

文章目录 引言语法项目结构定义 ReducerCounterReducer.ts 定义类型types.ts 使用 useReducer 管理状态Counter.tsx 应用入口App.tsx 解释与总结useReducer 的作用示例中的具体实现注意事项 引言 在 React 中&#xff0c;useState 是一个常用的 Hook&#xff0c;用于管理组件的…

STM32-串口-UART-Asynchronous

一&#xff0c;发送数据 #include "stdio.h" uint8_t hello[]"Hello,blocking\r\n"; HAL_UART_Transmit(&huart1,hello,sizeof(hello),500); 二&#xff0c;MicroLIB-printf(" hello\r\n") #include "stdio.h" #ifdef __GNUC…

IEEE期刊;latex模板学习记录

写在前面&#xff1a; 本次文章仅仅作为个人学习记录&#xff0c;不具备教程作用。 作者名称如何添加&#xff1a; 如果我们想添加多个作者的时候&#xff0c;因为我的latex模板只有一个作者&#xff1b;所以我一开始直接添加的。但是这样&#xff0c;会被以为一个作者。正确…