1,编写一个自定义校验注解ListValue
package com.atguigu.common.valid; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.ElementType.TYPE_USE; import static java.lang.annotation.RetentionPolicy.RUNTIME; /** * @Description: 自定义校验注解 * @Author: zyn * @Date: 2021-7-2 */ @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) @Retention(RUNTIME) @Documented @Constraint(validatedBy = {ListValueConstraintValidator.class })//指定自定义校验器 public @interface ListValue { String message() default "{com.atguigu.common.valid.ListVal.message}"; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; int[] vals(); }
建ValidationMessages.proerties文件,配置ListValue中的指定的message
com.atguigu.common.valid.ListVal.message=必须提交指定的值
此处有个坑,坑了我一个多小时,.proerties属性值取出来一直乱码,最后看了@一篇文章给了思路,删除重建好了(并没有像文中那样单独指定properties文件编码)
2,编写一个自定义校验器
判断校验是否成功
package com.atguigu.common.valid; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.util.HashSet; import java.util.Set; /** * @Description: 自定義校验注解. * @Author: zyn * @Date: 2021-7-2 */ //ConstraintValidator 接收两个 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); } } //判断是否校验成功 /** * @Description: * @Author: zyn * @Date: 2021-7-5 * @param value 标注校验注解属性的传过来的值,需要校验的值 */ @Override public boolean isValid(Integer value, ConstraintValidatorContext context) { return set.contains(value); } }
3,关联自定义校验器和自定义校验注解
主要是校验注解中Constraint validatedBy指定自定义校验器,在步骤1代码中已呈现
实体类需要校验的字段标注步骤1的自定义校验注解
@ListValue(vals={0,1},groups = AddGroup.class) private Integer showStatus;