当前位置: 首页 > article >正文

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

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.kler.cn/a/510244.html

相关文章:

  • 【专题二 二叉树中的深搜】98. 验证二叉搜索树
  • win11的WSL报错WslRegisterDistribution failed with error: 0x800701bc
  • 【网络协议】RFC3164-The BSD syslog Protocol
  • gitlab runner正常连接 提示 作业挂起中,等待进入队列 解决办法
  • 多元线性回归分析
  • 麒麟系统下载依赖到本地
  • 打造智能气象预测系统:AI如何改变天气预报的未来
  • 电梯系统的UML文档04
  • 创建一个简单的spring boot+vue前后端分离项目
  • Jmeter Beanshell脚本批量提取接口的值生成csv文档
  • 蓝桥杯训练—斐波那契数列
  • 我的常用vim操作
  • Harmony OS 5.0.1 模拟器报未开启 Hyper-V解决方法
  • 华为HuaweiCloudStack(一)介绍与架构
  • 【STM32-学习笔记-13-】WDG看门狗
  • python有goto语句吗
  • 《Java开发手册》核心内容
  • Qt开发:QSqlDatabase的常见用法
  • JAVA实现捡金币闯关小游戏(附源码)
  • xclip和xsel命令行工具详解
  • 大语言模型的语境中“越狱”和思维链
  • 最新-CentOS 7安装Docker容器(适合本地和云服务器安装)
  • 统信V20 1070e X86系统编译安装PostgreSQL-13.11版本以及主从构建
  • 嵌入式工程师必学(67):SWD仿真接口(for ARM)的使用方法
  • 在 Windows 上,如果忘记了 MySQL 密码 重置密码
  • 软考中级复习篇章:数据结构部分的复习