spring boot 中 controller 入参校验采用声明式注解+自动触发,核心是 dto 加 jsr-303 注解(如 @notblank、@email)、controller 参数加 @valid/@validated 启用校验、@restcontrolleradvice 统一处理 methodargumentnotvalidexception 等异常并返回标准错误响应,2.3+ 需显式引入 spring-boot-starter-validation。

Spring Boot 中对 Controller 入参校验,核心是用声明式注解 + 框架自动触发,不写 if 判断,也不手动调用校验器。关键在于三层配合:DTO 定义约束、Controller 标记启用、全局统一捕获错误。
DTO 类加校验注解
在接收请求的 DTO(或 VO、Form)字段上直接添加 JSR-303 注解,比如:
- @NotBlank:字符串非空且非纯空白(比 @NotNull 更严格)
- @Email:校验邮箱格式
- @Size(min = 3, max = 20):限制字符串或集合长度
- @Min(1) / @Max(100):数值范围控制
- @Pattern(regexp = "..."):正则自定义格式(如手机号、用户名规则)
示例:
public class UserRegisterDTO {@NotBlank(message = "用户名不能为空")
@Size(min = 3, max = 16, message = "用户名长度为3-16位")
private String username;
@Email(message = "邮箱格式不正确")
private String email;
}
Controller 方法启用校验
根据参数类型选择对应注解:
- 单个简单参数(如 @PathVariable、@RequestParam):直接在参数前加注解,例如 @Min(1) Long id
- 复杂对象(如 @RequestBody):在参数前加 @Valid,表示递归校验整个对象及其嵌套字段
- 需要分组校验(如新增/修改用不同规则):改用 @Validated(GroupA.class),并在 DTO 注解中指定 groups 属性
注意:@Valid 必须配合 DTO 上的注解才生效;单独加在参数上不会触发校验。
统一处理校验失败异常
校验失败时,Spring 会抛出特定异常,需用 @RestControllerAdvice 全局拦截:
-
MethodArgumentNotValidException:@RequestBody + @Valid 失败时抛出,可通过
bindingResult.getAllErrors()获取所有错误信息 - BindException:@ModelAttribute 或表单提交失败时抛出
建议封装成标准响应格式,例如:
{"code": 400,
"message": "参数校验失败",
"details": ["用户名不能为空", "邮箱格式不正确"]
}
依赖和版本注意
Spring Boot 2.3.x 及以后版本,spring-boot-starter-validation 需显式引入,不能只靠 starter-web 自带:
旧版本(2.2.x 及之前)starter-web 已包含该能力,无需额外添加。











