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));}}
}