spring boot json入参校验核心是基于jsr-303/380规范与jackson反序列化流程,通过@valid+校验注解实现声明式自动校验。需引入spring-boot-starter-validation依赖,在dto字段标注@notblank、@notnull等注解,在controller中对@requestbody加@valid,并统一处理methodargumentnotvalidexception异常返回友好提示。

Spring Boot 对 JSON 入参校验,核心是结合 JSR-303/380 规范(通过 Hibernate Validator 实现)与 Jackson 反序列化流程,实现声明式、可复用、易维护的参数检查。不是靠一堆 if 判断,而是让框架在绑定请求体前自动拦截并反馈问题。
一、引入校验依赖
确保项目已添加 spring-boot-starter-validation(Spring Boot 2.3+ 默认包含,但显式声明更清晰):
- Maven 中确认有:
该依赖自动装配了校验器(Validator)和消息解析器,无需手动配置 Bean。
二、在 DTO 上标注校验注解
定义接收 JSON 的数据类(如 UserDTO),直接在字段上加约束注解:
-
@NotBlank:字符串非 null 且去除空格后不为空(推荐用于 String 类型必填字段) -
@NotNull:对象引用非 null(适用于 Integer、LocalDateTime 等包装类型) -
@Min/@Max:数值范围控制 -
@Email、@Pattern、@Size:格式与长度校验 -
@Valid:用于嵌套对象,触发其内部字段校验
示例:
public class UserDTO {
@NotBlank(message = "用户名不能为空")
private String username;
@NotNull(message = "年龄不能为空")
@Min(value = 1, message = "年龄不能小于1")
private Integer age;
@Email(message = "邮箱格式不正确")
private String email;
}
三、在 Controller 方法中启用校验
使用 @Valid 标记 @RequestBody 参数,框架会自动执行校验:
@PostMapping("/users")
public ResponseEntity> createUser(@Valid @RequestBody UserDTO dto) {
// 校验通过才进这里
return ResponseEntity.ok().build();
}
⚠️ 注意:@Valid 是必须的,仅加注解不加 @Valid 不会触发校验。
四、统一处理校验失败异常
默认情况下,校验失败会抛出 MethodArgumentNotValidException,返回 HTTP 400 和默认错误结构。建议全局捕获并封装成业务友好的响应格式:
@RestControllerAdvice
public class ValidationExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity
这样前端收到的是类似 {"username":"用户名不能为空","email":"邮箱格式不正确"} 的清晰提示。
五、额外增强:禁止未知字段(按需启用)
若要求 JSON 严格匹配 DTO 字段(防止前端误传多余字段),可在特定 DTO 中使用 @JsonAnySetter 捕获未知字段,并在 Controller 中检查:
- 在 DTO 内定义
private final Map<string object> unknownFields = new HashMap();</string> - 添加
@JsonAnySetter方法存入该 Map - Controller 中判断
dto.getUnknownFields().isEmpty(),不满足则抛出自定义异常或拒绝请求
这种方式比全局设置 fail-on-unknown-properties=true 更灵活,只对关键接口生效。











