谷粒商城品牌管理校验(十一)

69、商品服务-API-品牌管理-JSR303自定义校验注解

JSR 303 自定义校验注解

(1)为什么使用自定义校验注解?
  上面的注解满足不了业务需求时,可以自定义校验注解,自定义校验规则。

(2)步骤:
Step1:
  需要自定义一个校验注解。
  可以创建一个 ValidationMessages.properties 用于保存默认的 message 信息。

Step2:
  需要自定义一个校验器,即自定义校验规则。
  实现 ConstraintValidator 接口,并重写相关方法。
注:
  initialize 方法用于初始化,可以获取 自定义的属性的值。
  isValid 方法用于校验,可以获取到实际的值,然后与自定义的属性值进行比较。

Step3:
  将校验注解 与 校验器 关联起来。
  @Constraint(validatedBy = {TestValidConstraintValidator.class})

(3)使用:
  如下例,自定义一个校验规则,判断数据长度是否合法。
  默认为 String 属性,当 String 为 Null 或者 长度大于 5 时,校验不通过。
  可以自定义 长度。
Step1:
  自定义一个校验注解,@ListValue,用于判断是否指定的值。

/**
 * @author WGR
 * @create 2020/6/1 -- 21:34
 */
@Documented
@Constraint(validatedBy = { ListValueConstraintValidator.class })
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface ListValue {
    String message() default "{com.dalianpai.common.valid.ListValue.message}";

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

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

    int[] vals() default { };
}

配置文件内容:

Step2:
  自定义一个校验器ListValueConstraintValidator, 用于检测值是否合法。

/**
 * @author WGR
 * @create 2020/6/1 -- 21:35
 */
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {

    private Set<Integer> set = new HashSet<>();
    //初始化方法
    @Override
    public void initialize(ListValue constraintAnnotation) {

        int[] vals = constraintAnnotation.vals();
        for (int val : vals) {
            set.add(val);
        }

    }

    //判断是否校验成功

    /**
     *
     * @param value 需要校验的值
     * @param context
     * @return
     */
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {

        return set.contains(value);
    }
}

Step3:
  使用注解。

使用 Postman 测试。

原文地址:https://www.cnblogs.com/dalianpai/p/13027642.html