引入指定包

<dependency>
     	<groupId>javax.validation</groupId>
       <artifactId>validation-api</artifactId>
       <version>2.0.1.Final</version>
   </dependency>

创建自定义校验类

//必须包含一下注解
@Documented
@Constraint(validatedBy = { ListValueConstraintValidator.class })//具体校验的实现,可以指定多个,适配不同的参数
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })//我们的自定义注解可以在哪里使用
@Retention(RUNTIME)
public @interface ListValue {
    
	//jsr303规范中 校验注解必须包含下面三个属性
    String message() default "{com.atguigu.common.valid.ListValue.message}";//当校验出错时 错误信息去哪里取 和下面配置文件需要匹配
    Class<?>[] groups() default { }; //必须支持分组校验
    Class<? extends Payload>[] payload() default { }; //自定义负载信息

    int[] vals() default { };//校验的具体参数
}

实体类中使用

@ListValue(vals={0,1})//可以使用message自定义信息,也可以写在配置文件中
private Integer showStatus;

错误信息配置文件

com.atguigu.common.valid.ListValue.message=必须提交指定的值

校验的实现

/*
*	需要实现ConstraintValidator
*	<ListValue,Integer> 校验注解,校验参数类型
*/
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);
        }
    }

    //判断是否校验成功

    /**
     *
     * @param value 需要校验的值,也就是我们提交的值
     * @param context
     * @return
     */
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {

        return set.contains(value);
    }
}