一 点睛
1 编写一个自定校验注解
2 编写一个自定义的校验器
3 关联自定义校验器和自定义的校验注解
二 实战
1 导入依赖
<!-- 自定义校验 -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
2 自定义校验配置文件内容
com.atguigu.common.valid.ListValue.message=必须提交指定的值
3 编写一个自定校验注解
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.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* @className: ListValue
* @description: 自定义校验注解,用于校验某个字段只能取指定的值
* @date: 2020/11/1
* @author: cakin
*/
@Documented
// 指定校验器
@Constraint(validatedBy = { ListValueConstraintValidator.class })
@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 { };
}
4 编写一个自定义的校验器
package com.atguigu.common.valid;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;
/**
* @className: ListValueConstraintValidator
* @description: 自定义校验器
* 第1个泛型:ListValue 指定是哪个注解
* 第2个泛型:Integer 校验什么类型的数据
* @date: 2020/11/1
* @author: cakin
*/
public class ListValueConstraintValidator implements ConstraintValidator<ListValue, Integer> {
// 指定的值
private Set<Integer> set = new HashSet<>();
// 初始化方法
@Override
public void initialize(ListValue constraintAnnotation) {
// 得到指定的值,存到set
int[] vals = constraintAnnotation.vals();
for (int val : vals) {
set.add(val);
}
}
// 判断是否校验成功
/**
* @param value 需要校验的值,也就是提交的字段
* @param context 上下文环境信息
* @return boolean 校验是否成功
*/
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
return set.contains(value);
}
}
5 实体类注解
/**
* 显示状态[0-不显示;1-显示]
*/
@NotNull(groups = {AddGroup.class, UpdateStatusGroup.class})
@ListValue(vals={0,1},groups = {AddGroup.class, UpdateStatusGroup.class})
private Integer showStatus;