版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
在介绍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
不支持