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

validator列表校验

spring-validation本质是javax.validation

⚠️但是他只能校验一个对象,并不能对对象列表中的对象进行校验。用了@Validated注解也会失效。

// 这样会失效
public Result exerciseSubmitCheck(@RequestBody @Validated List<EasySubmitRequest> requestList)

原本的代码:

import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class EasySubmitRequest {@NotBlank(message = "id不能为空")private String id;@NotBlank(message = "answer不能为空")private String answer;private String feedback;@NotBlank(message = "coursePlanId不能为空")private String coursePlanId;private Integer type;@NotBlank(message = "courseId不能为空")private String courseId;@NotBlank(message = "chapterId不能为空")private String chapterId;
}

 效果:

{"success": false,"message": "操作失败,(从1开始数)第 1 条:id, id不能为空","code": 500,"result": null,"timestamp": 1757036284367
}

现在自己封装了一个MyListValidator,用来循环校验。使用方法如下:

1.这直接把这段代码加入到controller中。

public Result exerciseSubmitCheck(@RequestBody List<EasySubmitRequest> requestList) {// 使用自己封装的列表校验器MyListValidator.validateList(requestList);
}

2.别忘了拷贝下面封装好的工具类代码放到项目中。

import org.springframework.stereotype.Component;import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;@Component
public class MyListValidator {// 全局只需要一个 Validator,线程安全,可复用private static final ValidatorFactory factory = Validation.buildDefaultValidatorFactory();private static final Validator validator = factory.getValidator();/*** 循环校验 List 里的每个元素,把错误汇总成一条字符串* 有错误直接抛 RuntimeException,方便 Controller 统一捕获*/public static <T> void validateList(List<T> list) {if (list == null || list.isEmpty()) return;List<String> errors = new ArrayList<>();for (int i = 0; i < list.size(); i++) {T item = list.get(i);Set<ConstraintViolation<T>> violations = validator.validate(item);for (ConstraintViolation<T> v : violations) {errors.add(String.format("(从1开始数)第 %d 条:%s, %s", i+1, v.getPropertyPath(), v.getMessage()));}}if (!errors.isEmpty()) {throw new IllegalArgumentException(String.join(";", errors));}}
}

http://www.xdnf.cn/news/20117.html

相关文章:

  • OCA、OCP、OCM傻傻分不清?Oracle认证就看这篇
  • 四六级学习资料管理系统的设计与实现(代码+数据库+LW)
  • pandas的使用(1)0905
  • 如何制造一个AI Agent:从“人工智障”到“人工智能”的奇幻漂流
  • leetcode399.除法求值
  • Redis-持久化
  • 疯狂星期四文案网第61天运营日记
  • CSP-J初赛for(auto)用法
  • 【Leetcode】高频SQL基础题--180.连续出现的数字
  • 计算机原理-计算机操作系统-硬盘缓存、断电丢数据篇
  • 力扣416:分割等和子集
  • 【无GGuF版本】如何在Colab下T4运行gpt-oss 20B
  • spring事物失效场景
  • MySQL主从同步--主从复制进阶
  • Java 提取 PDF 文件内容:告别手动复制粘贴,拥抱自动化解析!
  • 生成模型实战 | 深度分层变分自编码器(Nouveau VAE,NVAE)
  • 华为在国内搞的研发基地有多野?标杆游学带你解锁“研发界顶流”
  • leetcode算法刷题的第二十七天
  • 【开题答辩全过程】以 高校教室管理系统为例,包含答辩的问题和答案
  • 24V降12V,8A,电路设计,WD5030L
  • 2025年- H118-Lc86. 分隔链表(链表)--Java版
  • 工厂办公环境如何实现一台服务器多人共享办公
  • 【AI论文】Robix:一种面向机器人交互、推理与规划的统一模型
  • 【Java实战㉖】深入Java单元测试:JUnit 5实战指南
  • python代码Bug排查
  • 案例分享|企微智能会话风控系统:为尚丰盈铝业筑牢沟通安全防线
  • 【Vue3+TypeScript】H5项目实现企业微信OAuth2.0授权登录完整指南
  • 医疗问诊陪诊小程序:以人性化设计构建健康服务新生态
  • 微信小程序一个页面同时存在input和textarea,bindkeyboardheightchange相互影响
  • 基于STM32单片机的水位浑浊度检测设计