Spring中如何用javax.validation.constraints验证List内部元素长度?@Size仅校验列表大小
解决Spring中List集合内部元素的长度校验问题
你说得没错,@Size注解直接加在List字段上时,只会校验集合的元素个数(也就是列表的大小),没法管到每个元素的长度。要实现对List内部元素的校验,我们可以通过Spring Validation的嵌套校验能力来解决,分两种情况来处理:
一、List元素是String类型(或基本类型包装类)
如果你的List里存的是String,要校验每个字符串的长度,需要做这几步:
- 在你的DTO类上加上
@Validated注解——这是Spring提供的注解,用来开启方法级的校验支持,包括集合内部元素的校验。 - 在List字段上添加
@Valid注解,触发框架对集合内每个元素的递归校验。 - 用
@ElementCollection配合@Size来指定每个String元素的长度约束(这个注解原本是JPA的,但Validation框架也能识别它,用来标记这是元素集合,把@Size应用到每个元素上)。
完整的代码示例:
import org.springframework.validation.annotation.Validated; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import javax.persistence.ElementCollection; // 即使不是JPA实体也能用来触发元素校验 import java.util.List; @Validated // 必须加,开启集合元素校验支持 public class RequestInputParamaters { @NotNull(message = "文档标识列表不能为null") @NotEmpty(message = "文档标识列表不能为空") @Size(min = 1, max = 4, message = "文档标识列表的元素个数必须在1-4之间") // 校验列表大小 @Valid // 触发内部元素校验 @ElementCollection @Size(min = 1, max = 20, message = "每个文档标识的长度必须在1-20个字符之间") // 校验每个String元素的长度 private List<String> documentIdentifier_value; // 别忘了添加getter和setter方法 public List<String> getDocumentIdentifier_value() { return documentIdentifier_value; } public void setDocumentIdentifier_value(List<String> documentIdentifier_value) { this.documentIdentifier_value = documentIdentifier_value; } }
二、List元素是自定义对象
如果List里是你自己定义的DTO对象,那就更简单了:
- 同样在顶层DTO类上加
@Validated。 - 在List字段上加
@Valid,触发对每个对象的校验。 - 在自定义对象的字段上直接加
@Size等校验注解即可。
示例代码:
// 顶层DTO @Validated public class RequestInputParamaters { @NotNull @NotEmpty @Size(min = 1, max = 4) @Valid // 校验每个DocumentIdentifier对象 private List<DocumentIdentifier> documentIdentifier_value; // getter和setter } // 自定义元素对象 public class DocumentIdentifier { @Size(min = 1, max = 20, message = "文档标识长度不符合要求") private String value; // getter和setter public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
最后一步:在Controller中触发校验
不管是哪种情况,你都需要在Controller的方法参数上加上@Validated(或者@Valid,但@Validated更适合Spring的场景),这样Spring才会自动执行校验:
import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class DocumentController { @PostMapping("/process-documents") public ResponseEntity<String> processDocuments(@Validated @RequestBody RequestInputParamaters params) { // 你的业务逻辑 return ResponseEntity.ok("处理成功"); } }
另外要确保项目里已经引入了Spring Validation的依赖,如果是Spring Boot项目,直接加这个Maven依赖就行:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
内容的提问来源于stack exchange,提问作者java
相关产品推荐
相关产品推荐

