Spring Validation验证框架在实际项目中的应用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/wangchengming1/article/details/100132085

在介绍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 验证注解的元素值是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不支持

猜你喜欢

转载自blog.csdn.net/wangchengming1/article/details/100132085