自定义校验注解

自定义校验注解

在前后端分离的开发中,我们常见的使用Validator进行校验,但是有时候这个框架的一些注解并不能满足我们生产中的所有需求,就比如后端需要判断一个状态值只能是0或者1或者2,这个时候就需要自定义一个注解了。

自定义注解

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.PARAMETER})
// FlagValidatorClass.class 这个类就是验证是否通过
@Constraint(validatedBy = FlagValidatorClass.class)
public @interface FlagValidator {
     // value就是需要传值的,这里使用数组,即前端传来的值只要这个数组里存在就通过
    int[] value() default {};
    // 参数校验失败的时候返回的默认信息
    String message() default "flag is not found";
    // 分组使用
    Class<?>[] groups() default {};
    // 不知道是啥,反正都有,写上总没错
    Class<? extends Payload>[] payload() default {};
}

自定义校验逻辑

//第一个参数需要指定为你自定义的校验注解类
// 第二个指定为你要校验属性的类型,如果前端传的是List那这里的Integer就变成List<String>,就是需要接受前端数据的数据类型
//isValid方法中就是具体的校验逻辑
public class FlagValidatorClass implements ConstraintValidator<FlagValidator, Integer> {

    private FlagValidator constraint;

     // 一般来说如果用到了自定义注解里面的值,从这个初始化方法中给全局变量赋值,方便isValis()方法中使用
    @Override
    public void initialize(FlagValidator constraint) {
        this.constraint = constraint;
    }

    /**
     * 第一个参数value就是接收到的前端的值
     * 第二个参数目前没用到
     * 如果返回true就表示通过,false就表示校验失败,返回默认的信息
     */
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
      // 如果前端不传值返回false,返回错误异常
      if(value == null) {
        	return false;
      }	
        // 这个values就是你放在注解上的value数组,即 @FlagValidator(value = {0,1},message = "预约状态参数错误") 这里面的value值
      	int[] values = constraint.value();
        // 遍历设定的值,当有一个值等于的话,就放行,否则拒绝放行
        for (int i : values) {
            if (i == value) {
                return true;
            }
        }
        return false;
    }
}

在字段上添加自定义注解

/**
 * 预约状态 0未启动 1启用中
 */
@NotNull(message = "预约状态不可为空",groups = CreateGroup.class)
@FlagValidator(value = {0,1},message = "预约状态参数错误")
private Integer roomAppStatus;

这个时候,前端传来值0或者1都可以放行通过,只要前端传的不是0或者1或者为空的话,就会返回异常信息。

原文地址:https://www.cnblogs.com/sun2020/p/13959824.html