1. 给字段 showStatus上标注自定义注解 @ListValue,vals配置校验的值
2. 创建注解 @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.RetentionPolicy.RUNTIME;
@Constraint(validatedBy = {ListValueConstraintValidator.class})
@documented
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
public @interface ListValue {
//配置文件中错误提示信息的名称
String message() default "{com.atguigu.common.valid.ListValue.message}";
Class>[] groups() default {};
Class extends Payload>[] payload() default {};
//自定义值的类型
int[] vals() default {};
}
3. 创建自定义约束校验器,继承 ConstraintValidator,第一个泛型是自定义注解、第二个是校验值的类型,也即注解标注的字段的类型
package com.atguigu.common.valid; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.util.HashSet; import java.util.Set; public class ListValueConstraintValidator implements ConstraintValidator{ private static Set set = new HashSet (); @Override public void initialize(ListValue constraintAnnotation) { ConstraintValidator.super.initialize(constraintAnnotation); for (Integer val : constraintAnnotation.vals()) { set.add(val); } } @Override public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) { return set.contains(integer); } }
4. 在 resources 目录下创建一个 ValidationMessages.properties配置文件,key 是第二步 message 设置的默认值,value 是自定义错误信息
com.atguigu.common.valid.ListValue.message=必须提交指定的值
5. 测试
校验失败:
校验成功:



