Spring Validation是Spring框架中用于数据校验的核心模块,通过注解简化数据校验逻辑。
1. 依赖引入(SpringBoot项目)
Spring Boot项目:自动包含spring-boot-starter-validation
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2. 基本使用
在Spring MVC的Controller中使用@Valid和@Validated触发校验。
示例代码:
@PostMapping("/users")
public ResponseEntity<?> createUser(@RequestBody @Valid User user, BindingResult result) {if (result.hasErrors()) {// 处理校验错误return ResponseEntity.badRequest().body(result.getAllErrors());}// 保存用户return ResponseEntity.ok(userService.save(user));
}
- @Valid:触发校验
- @Validated:Spring的扩展,支持分组校验
- BindingResult:保存校验结果,需紧跟被校验参数
3. 常用校验注解
以下是Bean Validation内置的校验注解:
注解 | 说明 |
---|---|
@NotNull | 值不能为null |
@NotEmpty | 字符串/集合不能为空 |
@NotBlank | 字符串必须包含非空格字符 |
@Size(min, max) | 字符串/集合长度在范围内 |
@Min(value) | 数字最小值 |
@Max(value) | 数字最大值 |
校验邮箱格式 | |
@Pattern(regexp) | 正则表达式匹配 |
@Positive | 必须为正数 |
@Future | 日期必须是未来时间 |
示例实体类:
public class User {@NotBlank(message = "用户名不能为空")private String username;@Size(min = 6, max = 20, message = "密码长度需在6-20位")private String password;@Email(message = "邮箱格式不正确")private String email;// Getters and Setters
}
4.分组校验
通过分组实现不同场景的差异化校验规则。
定义分组接口:
public interface CreateGroup {}
public interface UpdateGroup {}
在实体中使用分组:
public class User {@Null(groups = CreateGroup.class, message = "创建时ID必须为空")@NotNull(groups = UpdateGroup.class, message = "更新时ID不能为空")private Long id;// 其他字段...
}
在Controller中指定分组:
@PostMapping("/users")
public ResponseEntity<?> createUser(@Validated(CreateGroup.class) @RequestBody User user) {// ...
}
5. 自定义校验
步骤1:定义注解
@Target({FIELD, PARAMETER})
@Retention(RUNTIME)
@Constraint(validatedBy = PhoneValidator.class)
public @interface Phone {String message() default "手机号格式不正确";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}
步骤2:实现校验逻辑
public class PhoneValidator implements ConstraintValidator<Phone, String> {@Overridepublic boolean isValid(String phone, ConstraintValidatorContext context) {return phone != null && phone.matches("^1[3-9]\\d{9}$");}
}
步骤3:使用自定义注解
public class User {@Phoneprivate String phone;
}