使用JSR303校验注解可以帮助我们做数据校验,但是遇到一些特点的需求就需要编写自定义校验注解。现在我有个需求,我的一个字段 private Integer showStatus; 我想校验是0或1。
自定义校验的实现:
1、编写一个自定义的校验注解
新建一个注解
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {})
public @interface ListValue {
String message() default "{com.vident.common.validator.ListValue.message}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
int[] values() default { };
}
在resource目录下新建一个文件ValidationMessages.properties,里边内容填写为: com.vident.common.validator.ListValue.message=必须提交指定的值
这里对应 String message() default "{com.vident.common.validator.ListValue.message}";
如果没指定message,当校验不通过会默认的抛出ValidationMessages.properties文件里对应的信息。
2、编写一个自定义的校验器
public class ListvaluesConstraintValidator implements ConstraintValidator<ListValue,Integer> {
private Set<Integer> set = new HashSet<>();
@Override
public void initialize(ListValue constraintAnnotation) {
int[] values = constraintAnnotation.values();
if(values.length> 0){
for(int value : values){
set.add(value);
}
}
}
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
return set.contains(value);
}
}
ConstraintValidator<ListValue,Integer>这里第一个参数指定我自己定义的注解ListValue,第二个参数我指定要校验的类型为Integer。
3、关联自定义的校验器和自定义校验注解
在自定义注解的@Constraint(validatedBy = {ListvaluesConstraintValidator.class })中添加刚刚写的自定义校验器。
4、使用自定义注解
@ListValue(values = {0,1})
private Integer showStatus;
这样我们就可以指定该字段要校验是否是0或1了。