整体思路
- 创建一个自定义的数据校验注解
- 创建一个自定义的数据校验器
- 关联数据校验注解和数据校验器
1.创建自定义数据校验注解
思路:
1.引荐validation自带的@NotBlank注解。做出下面的自定义注解代码
- @Constraint: 绑定数据校验器,可绑定多个。
@Documented
@Constraint(validatedBy = {ListValueConstraintValidator.class})
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface ListVals {
// 默认的返回信息。也可以用message标签来自定义返回信息。
// "{com.xue.common.valid.ListVals.message}"这个的意思是在该服务的配置文件中找这一途径的message属性
String message() default "{com.xue.common.valid.ListVals.message}";
// 分组
Class<?>[] groups() default { };
//负载
Class<? extends Payload>[] payload() default { };
// 定义了一个int数组,默认为空
int[] vals() default {};
}
2.创建一个自定义的数据校验器
在notBlank注解里面的@Constraint注解中我们发现,
validateBy 后面所跟的类需要是继承了ConstraintValidator。而ConstraintValidator是一个接口
所以我们要写自定义的数据校验器就需要实现这个接口
注意:
- ConstraintValidator<ListVals,Integer>,第一个是一个注解,第二个是数据的类型。根据自己想要遍历的注解中的某些值,进行改变
- initialize()方法:只是将使用这个注解的其中的 值遍历到集合中
- isValid()方法:传入被校验字段的值,和set中的值进行比对
public class ListValueConstraintValidator implements ConstraintValidator<ListVals,Integer> {
//创建一个set集合,用于放置注解中设置的默认值
HashSet<Integer> set = new HashSet<>();
@Override
public void initialize(ListVals constraintAnnotation) {
//1.获取到 注解ListVals中设置的值,并放入set集合中
int[] vals = constraintAnnotation.vals();
// 遍历注解中的值,并放入set集合
for (int val : vals) {
set.add(val);
}
}
// value:待校验的值
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
return set.contains(value);
}
}
3.关联数据校验注解和数据校验器
通过数据校验注解的@Constraint注解 绑定。