在介绍Spring Validation验证框架之前,先看一下我们常用的校验注解都有哪些
| 注解 | 说明 |
|---|---|
| @Null | 限制只能为null |
| @NotNull | 限制必须不为null |
| @AssertFalse | 限制必须为false |
| @AssertTrue | 限制必须为true |
| @DecimalMax(value) | 限制必须为一个不大于指定值的数字 |
| @DecimalMin(value) | 限制必须为一个不小于指定值的数字 |
| @Digits(integer,fraction) | 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction |
| @Future | 限制必须是一个将来的日期 |
| @Max(value) | 限制必须为一个不大于指定值的数字 |
| @Min(value) | 限制必须为一个不小于指定值的数字 |
| @Past | 限制必须是一个过去的日期 |
| @Pattern(value) | 限制必须符合指定的正则表达式 |
| @Size(max,min) | 限制字符长度必须在min到max之间 |
| @Past | 验证注解的元素值(日期类型)比当前时间早 |
| @NotEmpty | 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) |
| @NotBlank | 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格 |
| 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式 |
看到这个表格之后,是不是感觉很熟悉,只要是交互式网站数据校验就是不可或缺的功能。
Hibernate validator在上面基础的注解上对校验注解进行了扩展,扩展注解如下:
| 注解 | 说明 |
|---|---|
| @Eamil | 被注释的元素必须是电子邮箱 |
| @Length | 被注释的字符串的大小必须在指定范围类 |
| @NotEmpty | 被注释的字符串必须非空 |
| @Range | 被注释的元素必须在指定范围内 |
Spring Validation如何使用,结合BindingResult
- 创建一个Spring Boot项目,并创建对应的实体类。
@Data
class Employee {
@NotNull(message = "name must be not empty.")
private String name;
@NotNull
@Max(value = 35, message = "Must be less than 35.")
private Integer age;
@NotNull(message = "phone number must be not empty.")
private String phone;
@Email
@NotNull(message = "e-mail wrong.")
private String eMail;
}
@Data
public class Manager {
@NotNull(message = "Id must be not empty.")
private Integer id;
@Valid
@Size(min = 1, message = "At least one employee")
private List<Employee> employees;
}
- 创建一个测试的controller
@RestController
@RequestMapping("/user")
public class TestController {
@PostMapping("/add")
public String addUser(@RequestBody @Valid Manager manager, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
List<String> errorMessages = new ArrayList<>();
for (ObjectError error : bindingResult.getAllErrors()) {
errorMessages.add(error.getDefaultMessage());
System.out.println(error.toString());
}
return "fail";
}
return "success";
}
}
- 测试校验结果
- 准备一个测试数据如下:
{ "id":10001, "employees":[ { "name":null, "age":40, "phone":"1111", "eMail":"dss" } ] } - 开始测试,使用postman

- 结果展示
可以看到name,age,email这三个字段的校验结果,但是phone我随便输入了一串数字,也是应该校验到的,但是Spring Validation验证框架并没有提供手机号校验的注解,所以接下来自定义校验就要出场了。

- 准备一个测试数据如下:
自定义校验
业务需求总是比框架提供的这些简单校验要复杂的多,我们可以自定义校验来满足我们的需求。自定义Spring Validation非常简单,主要分为两步。
- 定义一个注解
@Documented
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PhoneValidator.class)
public @interface Phone {
/**
* 校验不通过的message
*/
String message() default "请输入正确的手机号";
/**
* 分组校验
*/
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
- 实现这个注解
public class PhoneValidator implements ConstraintValidator<Phone, String> {
@Override
public boolean isValid(String phone, ConstraintValidatorContext constraintValidatorContext) {
if(!StringUtils.isEmpty(phone)){
String regex = "^1(3|4|5|7|8)\\d{9}$";
return phone.matches(regex);
}
return true;
}
}
- 测试

可以看到手机号的格式校验也成功了,就证明框架的自定义注解是成功的。
@Validated与@Valid的简单对比说明
@Valid注解与@Validated注解功能大部分类似;两者的不同主要在于:
@Valid属于javax下的,而@Validated属于spring下@Valid支持嵌套校验(上面的实例就用了嵌套校验)、而@Validated不支持@Validated支持分组,而@Valid不支持

本文详细介绍SpringValidation框架中常用校验注解及其用法,包括@Null、@NotNull等,并通过示例展示如何在SpringBoot项目中结合BindingResult进行数据校验。同时,探讨自定义校验注解的方法及其实现。
491

被折叠的 条评论
为什么被折叠?



