本文共 1908 字,大约阅读时间需要 6 分钟。
问题:如果我们校验如下的方式是可以用正则表达式,可是有时候我们的业务只有正则也完成不了,所以我们需要自定义校验注解
/** * 显示状态[0-不显示;1-显示] */ @ListValue(vals={ 0,1}) private Integer showStatus;
@ListValue(vals={0,1})就是我们需要编写的自定义校验注解
编写自定义校验注解思路:
1)编写一个自定义的校验注解 2)编写一个自定义的校验器 3)关联自定义的校验器和自定义的校验注解@ListValue(vals={ 0,1}) private Integer showStatus;
//原信息数据 //可以标注在那些位置@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})//运行时获取到@Retention(RetentionPolicy.RUNTIME)@Documented//使用哪个校验器进行校验@Constraint( validatedBy = { ListValueConstraintValidator.class})public @interface ListValue { //校验出错以后去哪取(ValidationMessages.properties)取到javax.validation.constraints.NotNull.message这一个数据 //根据上面的思路,我们就可以自己在resources中创建ValidationMessages.properties,配置如下的内容 String message() default "{com.atstudying.common.valid.ListValue.message}"; //可以实现分组校验 Class [] groups() default { }; //自定义一些负载信息 Class [] payload() default { }; int [] vals() default { };}
public class ListValueConstraintValidator implements ConstraintValidator{ private Set set=new HashSet<>(); //初始化方法 @Override public void initialize(ListValue constraintAnnotation) { //获取详细信息vals={0,1}0,1 int [] vals=constraintAnnotation.vals(); for (int val :vals){ set.add(val); } } //判断是否校验成功 @Override public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) { //如果我们获取值为3=value,传进来判断不会等于0,1就是返回false return set.contains(value); }}
ListValue
@Constraint( // Class >[] validatedBy(); //可以指定多个不同的校验器,适配不同类型的校验 validatedBy = { ListValueConstraintValidator.class})
转载地址:http://zzhq.baihongyu.com/