在Controller方法参数加@Valid并配合JSR-303注解(如@NotBlank、@NotNull、@Min等)可自动校验,规则须定义在DTO/VO类字段上;需引入spring-boot-starter-validation依赖,通过BindingResult或全局异常处理器统一处理错误。

直接在 Controller 方法参数上加 @Valid,配合实体类字段上的校验注解,就能自动拦截非法参数,不用写一堆 if-else。
实体类上声明校验规则
校验逻辑要提前定义在 DTO 或 VO 类里,用标准 JSR-303 注解标记字段约束。关键不是“能不能校”,而是“在哪写规则”——必须写在数据载体本身上,才可复用、可读、可维护。
- @NotBlank:String 类型专用,非 null 且 trim 后长度 > 0(比 @NotNull 更严格)
- @NotNull:适用于任意类型,只判 null,不处理空字符串或空集合
- @Min/@Max:用于数值字段,如年龄、分页 size,支持 int/long/BigDecimal 等
- @Email/@Pattern:做格式校验,比如邮箱正则或手机号 ^1[3-9]\d{9}$
- @Size(min=2, max=10):既可用于 String 长度,也可控 List 大小或 Map 元素数
- 每个注解都带 message 属性,例如 @NotBlank(message="用户名不能为空"),便于统一提示
Controller 中启用自动校验
@Valid 不是摆设,它才是触发校验的开关。加在方法参数前,Spring 才会扫描该对象所有字段的注解并执行验证。
- 入参是对象(如 @RequestBody UserDTO user),必须加 @Valid,否则注解完全不生效
- 若参数是简单类型(如 @RequestParam @Min(1) Long id),可直接在参数上加校验注解,无需额外对象包装
- 级联校验也靠 @Valid:如果字段类型本身也是带注解的实体(如 User 中有 @Valid Address address),会递归校验
捕获并处理校验失败
校验出错时,默认返回 400 Bad Request,但业务系统通常需要自定义响应格式。有两种主流方式:
立即学习“Java免费学习笔记(深入)”;
- 显式接收 BindingResult:紧跟在被校验参数后,顺序不能错。调用 result.hasErrors() 判断,并用 result.getAllErrors() 提取每条 message
- 全局异常拦截:用 @RestControllerAdvice 捕获 MethodArgumentNotValidException,统一组装 JSON 错误体,避免每个接口重复写错误处理逻辑
- 注意:没配 BindingResult 又没全局异常处理器,服务会直接 400 响应,前端可能只看到空白或默认错误页
依赖和基础配置不能少
Spring Boot 项目默认不带校验能力,需显式引入 starter。
- Maven 加依赖:
org.springframework.boot spring-boot-starter-validation - 该 starter 内置 Hibernate Validator 实现,无需额外配置 validator bean
- 确保实体类有标准 getter/setter,否则绑定阶段就失败,校验根本不会触发


















