Skip to content

在日常的接口开发中,经常要对接口的参数做校验,例如,登录的时候要校验用户名密码是否为空。但是这种日常的接口参数校验太烦锁了,代码繁琐又多。

Validator框架就是为了解决开发人员在开发的时候少写代码,提升开发效率的;它专门用来做接口参数的校验的,例如: Email校验、用户名长度必须位于6到12之间等等。

注意,SpringBoot最新版本已经移除了自带的Validator依赖,因此发现没有该依赖后请导入以下依赖。

xml
<!-- validation依赖 -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-validation</artifactId>
   <version>2.3.4.RELEASE</version>
</dependency>

开始使用

创建一个vo类,用来做参数的注解

java
@Data
@ApiModel("小车状态")
public class CarStatus {

    @NotEmpty(message = "小车id不能为空")
    @Length(max = 11,message = "id长度不能超过11位")
    @ApiModelProperty("小车id")
    private int CarId;

    @NotEmpty(message = "小车状态不能为空")
    @Pattern(regexp = "",message = "小车状态有误")
    @ApiModelProperty("小车状态")
    private String CarAction;
}

使用:

java
@PostMapping("SetCarMove")
public CarStatus firstQuestion(@RequestBody @Validated CarStatus car) {
    // 相当于省略下面两句话
    /*if (car == null || (!"Start".equals(car.getCarAction()) && !"Stop".equals(car.getCarAction()))) {
        throw new CarStatusException(StatusCode.CAR_STATUS_ERROR,"参数不正确");
    }*/
    System.out.println(car);
    return car;
}

常用注解

java
@null           验证对象是否为空
@notnull     验证对象是否为非空
@asserttrue       验证 boolean 对象是否为 true
@assertfalse      验证 boolean 对象是否为 false
@min           验证 number 和 string 对象是否大等于指定的值
@max           验证 number 和 string 对象是否小等于指定的值
@decimalmin    验证 number 和 string 对象是否大等于指定的值,小数存在精度
@decimalmax    验证 number 和 string 对象是否小等于指定的值,小数存在精度
@size           验证对象(array,collection,map,string)长度是否在给定的范围之内
@digits       验证 number 和 string 的构成是否合法
@past           验证 date 和 calendar 对象是否在当前时间之前
@future       验证 date 和 calendar 对象是否在当前时间之后
@pattern     验证 string 对象是否符合正则表达式的规则
@Email     验证邮箱

例子

java
@size (min=3, max=20, message="用户名长度只能在3-20之间")
@size (min=6, max=20, message="密码长度只能在6-20之间")
@pattern (regexp="[a-za-z0-9._%+-]+@[a-za-z0-9.-]+\\.[a-za-z]{2,4}", message="邮件格式错误")
@Length(min = 5, max = 20, message = "用户名长度必须位于5到20之间")  
@Email(message = "比如输入正确的邮箱")  
@NotNull(message = "用户名称不能为空") 
@Max(value = 100, message = "年龄不能大于100岁") 
@Min(value= 18 ,message= "必须年满18岁!" )  
@AssertTrue(message = "bln4 must is true")
@AssertFalse(message = "blnf must is falase")
@DecimalMax(value="100",message="decim最大值是100")
DecimalMin(value="100",message="decim最小值是100")
@NotNull(message = "身份证不能为空") 
@Pattern(regexp="^(\\d{18,18}|\\d{15,15}|(\\d{17,17}[x|X]))$", message="身份证格式错误")

高阶:自定义validator

因为validator框架支持的注解有限,不可能方方面面都支持,故需要自定义注解。

以手机号码为例子,写一个校验的validator注解。

步骤一:写一个注解

java
@Documented
@Constraint(validatedBy = CarStateValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CarState {
    String message() default "请输入正确的手机号码";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.METHOD,ElementType.FIELD,ElementType.ANNOTATION_TYPE,ElementType.CONSTRUCTOR,ElementType.PARAMETER})
    @interface List {
        CarState[] value();
    }
}

步骤二:写出注解的实现类

java
public class CarStateValidator implements ConstraintValidator<CarState,String> {

    private static final Pattern CAR_STATE_PATTERN = Pattern.compile("^(Start)|(Stop)$");

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        if (s == null || s.length() == 0){
            return true;
        }
        Matcher m = CAR_STATE_PATTERN.matcher(s);
        return m.matches();
    }

    @Override
    public void initialize(CarState constraintAnnotation) {

    }
}

步骤三:给vo类对应的属性加上注解

java
@CarState