谷粒商城品牌管理校验(十一)
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 测试。