目标:书写自定义校验注解和自定义校验器
自定义校验 * 1)、编写一个自定义的校验注解 * 2)、编写一个自定义的校验器 ConstraintValidator * 3)、关联自定义的校验器和自定义的校验注解
1.为实体加上自定义校验注解@ListValue:
/**
* 显示状态[0-不显示;1-显示],自定义校验,只有0,1
*/
@ListValue(vals={0,1},groups = {AddGroup.class})
private Integer showStatus;
2.在公共服务common下新建目录存放自定义校验注解ListValue以及自定义校验器ListValueConstraintValidator以及在resource下创建自定义校验的配置文件ValidationMessages.properties:
3.根据其他常规校验注解如@NotBlank编写自定义校验注解:
@Documented
@Constraint(
validatedBy = {}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(NotBlank.List.class)
public @interface NotBlank {
String message() default "{javax.validation.constraints.NotBlank.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface List {
NotBlank[] value();
}
}
仿写出自定义注解@ListValue:
/**
* 自定义校验注解,仿照@NotBlank写
*/
@Documented
//使用哪个校验器校验的
@Constraint(
validatedBy = {}
)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ListValue {
//在配置文件中取出com.atguigu.common.valid.ListValue.ListValue中的错误提示,
// 根据配置文件ValidationMessages.properties,自定义一个ValidationMessages.properties配置文件在common服务下
String message() default "{com.atguigu.common.valid.ListValue.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
//指定vals的默认值
int[] vals() default {};
}
在ValidationMessages.properties配置文件中配置报错信息:
com.atguigu.common.valid.ListValue.message=必须是指定的值0/1
5.导入依赖包:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
6.编写自定义校验器ListValueConstraintValidator:
/**
* 来源于自定义校验中validatedBy(),validatedBy()可以参考多个校验器;
* <p>
* 继承ConstraintValidator<校验注解,字段类型>
*/
public class ListValueConstraintValidator implements ConstraintValidator<ListValue, Integer> {
//定义一个Set<>用于存放详细信息
private Set<Integer> set = new HashSet<>();
//初始化方法,获取自定义注解的详细信息 如:(vals={0,1})
@Override
public void initialize(ListValue constraintAnnotation) {
int[] vals = constraintAnnotation.vals();
for (int val : vals) {
set.add(val);
}
}
/**
*
* @param value 需要校验的值
* @param context 整个校验的上下文环境信息
* @return
*/
//判断是否校验成功,根据传入需要校验的值,如:3
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
//做判断,如果包含了返回TRUE,否则返回FALSE
return set.contains(value);
}
}
7.在@ListValue中关联自定义校验注解和自定义校验器:
//使用哪个校验器校验的
@Constraint(
validatedBy = {ListValueConstraintValidator.class}
)
8.测试输入非指定的值:
输入指定的值:
自定义校验实现。