- 编写一个自定义的校验注解
- 编写一个自定义的校验器
- 关联自定义的校验器和自定义的校验注解
需求:在showStatus上添加一个自定义注解,只能传整数值1和0
实现:
自定义校验注解
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(
//ListValueConstraintValidator自定义校验器
validatedBy = {ListValueConstraintValidator.class}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ListValue {
// com.qq.common.valid.ListValue.message为校验错误时返回的提示
String message() default "{com.qq.common.valid.ListValue.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
// values为使用注解时传入的值(0,1)
int[]value()default {};
}
自定义提示信息的配置文件:ValidationMessages.properties
com.qq.common.valid.ListValue.message=必须提交指定的值
自定义校验器
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.annotation.Annotation;
import java.util.HashSet;
import java.util.Set;
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {
private Set<Integer> set = new HashSet<>();
//初始化方法
@Override
public void initialize(ListValue constraintAnnotation) {//ListValue为注解里拿到的值
int[] vals = constraintAnnotation.value();
for (int val:vals){
set.add(val);
}
}
//校验方法,判断是否为指定值
//value需要校验的值
@Override
public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
return set.contains(value);
}
}