Spring中数据校验基于JSR-303/380标准,通过@Valid/@Validated注解自动触发,需添加spring-boot-starter-validation依赖,DTO用@NotBlank、@Email等注解声明规则,Controller中结合BindingResult处理错误,支持嵌套校验与分组校验,也可自定义注解如@PhoneNumber。

Spring 中使用 Validator 框架进行数据校验,核心是结合 JSR-303/JSR-380(Bean Validation)标准,通过注解声明约束规则,并由 Spring 自动触发校验逻辑。不需要手动 new Validator 实例,而是依赖 Spring 的 @Valid 和 @Validated 注解 + 方法参数绑定机制完成校验。
添加依赖(确保校验器可用)
Spring Boot 2.3+ 默认移除了 spring-boot-starter-validation 的自动引入,需显式添加:
- Maven 中加入:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency> - 该依赖会引入
hibernate-validator(主流实现)和jakarta.validation-api(规范接口)
在 DTO 或实体类上添加校验注解
这是最常用、最直观的方式。例如定义一个用户注册请求对象:
public class UserRegisterDTO {
@NotBlank(message = "用户名不能为空")
@Size(min = 2, max = 20, message = "用户名长度为2-20个字符")
private String username;
@Email(message = "邮箱格式不正确")
private String email;
@Min(value = 18, message = "年龄不能小于18")
private Integer age;
// getter/setter 省略
}
常用注解包括:@NotNull、@NotBlank、@Email、@Pattern、@Future、@DecimalMin 等,都属于 Jakarta Bean Validation 规范。
立即学习“Java免费学习笔记(深入)”;
在 Controller 中启用自动校验
只需在入参前加 @Valid(或 @Validated),Spring MVC 会在绑定参数后自动校验,并将结果放入 BindingResult:
@PostMapping("/register")
public ResponseEntity<?> register(@Valid @RequestBody UserRegisterDTO dto,
BindingResult result) {
if (result.hasErrors()) {
String errorMsg = result.getFieldErrors().stream()
.map(e -> e.getField() + ": " + e.getDefaultMessage())
.collect(Collectors.joining("; "));
return ResponseEntity.badRequest().body(errorMsg);
}
// 校验通过,执行业务逻辑
return ResponseEntity.ok().build();
}
-
@Valid支持嵌套校验(如字段类型也是带注解的 Bean) -
@Validated是 Spring 扩展,支持分组校验(如新增用 GroupA,修改用 GroupB) -
BindingResult必须紧跟在被校验参数之后,否则 Spring 无法注入
自定义校验注解(按需扩展)
当内置注解不够用时,可自定义约束注解。例如校验手机号是否符合国内格式:
- 定义注解:
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PhoneNumberValidator.class)
public @interface PhoneNumber {
String message() default "手机号格式不正确";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
} - 实现校验器:
public class PhoneNumberValidator implements ConstraintValidator<PhoneNumber, String> {
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return value != null && value.matches("1[3-9]\d{9}");
}
} - 在 DTO 字段上使用:
@PhoneNumber private String phone;


















