Spring Boot中@NotBlank校验请求体JSON数组元素不生效解决方法
问题原因
嵌套数组元素校验不生效的核心原因是Java Bean Validation默认不会自动级联校验对象内部的引用类型属性(包括数组、集合内的元素),仅给bodyModel字段加校验注解、没有显式声明级联校验规则的话,框架不会进入数组元素内部执行校验逻辑。
解决步骤
1. 给数组字段添加级联校验注解
修改jsonRequest类中的body字段,添加@Valid注解,告知校验框架需要递归校验数组内的每个bodyModel元素:
public class jsonRequest { @NotBlank @JsonProperty(value = "name") private String name; @Valid // 核心:开启级联校验,遍历数组元素执行内部校验规则 @NotNull(message = "body参数不能为null") // 如需校验数组本身非空,添加该注解 @Size(min = 1, message = "body数组至少包含一个元素") // 如需校验数组长度不为0,添加该注解 @JsonProperty(value = "body") private bodyModel[] body; // 其余字段、getter/setter、构造方法省略 }
注意:
@NotBlank注解仅支持String类型字段校验,数组、集合类型的非空校验不要使用@NotBlank,你原有代码中给body数组加的@NotBlank是无效配置。
2. 确认校验依赖引入完整
Spring Boot 2.3.0及以上版本不再将校验组件默认包含在spring-boot-starter-web依赖中,如果你使用的是该版本及以上,需要手动引入校验starter依赖:
- Maven 配置(pom.xml):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
- Gradle 配置:
implementation 'org.springframework.boot:spring-boot-starter-validation'
3. 确认控制器层注解配置
你当前控制器层的写法是正确的,@Valid加在@RequestBody参数前即可触发请求体的入口校验,无需额外修改:
public ResponseEntity<BaseResponse> humanController(@RequestHeader Map<String, String> header,@Valid @RequestBody jsonRequest rqBody) throws ServiceException,Exception { // 业务逻辑省略 }
补充说明
如果你后续将数组替换为List<bodyModel>、Set<bodyModel>等集合类型,级联校验的配置方式完全一致,只需要在集合字段上添加@Valid注解,即可自动遍历集合内的所有元素执行校验规则。
内容的提问来源于stack exchange,提问作者Siva
相关产品推荐
相关产品推荐

