Spring Boot 列表元素校验 @RequestBody List<@Valid AssayResultUpdateRequest>

Spring Boot 列表元素校验 @RequestBody List<@Valid AssayResultUpdateRequest> 列表元素校验✅强烈推荐RequestBody ListValid AssayResultUpdateRequest/** * 批量保存检测结果 * * param updateRequests 检测结果更新请求对象列表 * return 操作结果 {link Result}lt;{link Void}gt; */ PostMapping(/save) LogDetail(批量保存检测结果) RequirePermission(module ModuleType.ASSAY_INPUT) public ResultVoid batchSaveAssayResults(RequestBody ListValid AssayResultUpdateRequest updateRequests) { UserContext userContext userService.getUserContext(PublicUtils.getUserName()); assayTaskService.batchSaveAssayResults(userContext, updateRequests); return Result.success(); }这里的Valid 是RequestBody Valid ListAssayResultUpdateRequest updateRequests这样 还是RequestBody ListValid AssayResultUpdateRequest updateRequests 这样 /** * 批量保存检测结果 * * param updateRequests 检测结果更新请求对象列表 * return 操作结果 {link Result}lt;{link Void}gt; */ PostMapping(/save) LogDetail(批量保存检测结果) RequirePermission(module ModuleType.ASSAY_INPUT) public ResultVoid batchSaveAssayResults(RequestBody Valid ListAssayResultUpdateRequest updateRequests) { UserContext userContext userService.getUserContext(PublicUtils.getUserName()); assayTaskService.batchSaveAssayResults(userContext, updateRequests); return Result.success(); }推荐使用RequestBody ListValid AssayResultUpdateRequest updateRequests方案B。 两种写法的区别写法校验范围效果ARequestBody Valid ListAssayResultUpdateRequest校验List集合对象本身- 如果List本身有约束如Size(max100)会生效。- 但Valid在集合上不一定自动级联到每个元素取决于 Spring 版本和配置。BRequestBody ListValid AssayResultUpdateRequest校验集合中的每个元素JSR-380 容器元素验证- 确保updateRequests列表中的每一个AssayResultUpdateRequest对象都会触发其内部的NotNull、Min、Size等校验。-语义最明确推荐✅ 为什么方案B更推荐1.语义清晰ListValid AssayResultUpdateRequest直观表达了“这个列表里的每个元素都需要验证”而方案A看起来像在验证列表本身。2.符合 JSR-380 规范Java Bean Validation 2.0JSR-380明确支持容器元素验证Container Element Validation通过ListValid T或Valid ListT都可以但前者是规范推荐的写法IDE 和静态分析工具也更容易识别。3.Spring 官方示例也采用方案BSpring 官方文档在介绍集合验证时通常这样写javapublic void process(RequestBody Valid ListValid User users) { ... }或使用包装类javapublic class UserList { Valid private ListUser users; }⚠️ 如果只用方案A可能发生什么在Spring Boot 3.x中由于底层Validator默认支持容器验证方案A也可能生效但取决于你的 Spring 版本。是否自定义了LocalValidatorFactoryBean。是否开启了spring.mvc.validation.enabled默认开启。为了不依赖框架默认行为方案B是更稳妥、更显式的选择。 最终推荐写法javaPostMapping(/save) LogDetail(批量保存检测结果) RequirePermission(module ModuleType.ASSAY_INPUT) public ResultVoid batchSaveAssayResults( RequestBody ListValid AssayResultUpdateRequest updateRequests ) { // ... }如果希望限制列表大小还可以结合使用javaRequestBody Size(max 100) ListValid AssayResultUpdateRequest updateRequests 总结写法推荐度理由RequestBody Valid ListAssayResultUpdateRequest⚠️ 可行但不推荐校验的是列表本身元素校验可能依赖框架默认行为RequestBody ListValid AssayResultUpdateRequest✅强烈推荐显式声明“列表中的每个元素都要校验”符合 JSR-380 规范行为确定直接使用方案B即可。