自定义注解完成个性化303校验
使用场景:当我们需要对实体类字段进行303校验,但是现有注解无法满足我们的个性化校验时,可以新建注解,完成自定义校验。
步骤
这里我们定义一个注解,用于校验某个字段值是否为指定的值。
一、自定义注解。可参照已有注解来定义,如NotBlank
@Documented
@Constraint(validatedBy = {ListConstraintValidator.class})
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
public @interface ListValue {
String message() default "{com.huang.gulimall.common.valid.ListValue.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
int[] value() default {};
}
说明:
1、@Constraint(validatedBy = {ListConstraintValidator.class}):表示通过ListConstraintValidator这个类中定义的校验规则来进行校验。
2、 String message() default “{com.huang.gulimall.common.valid.ListValue.message}”;:表是如果校验不通过,会获取ValidationMessages.properties
文件中的com.huang.gulimall.common.valid.ListValue.message
的值。注意:303校验不通过时的默认提示消息都保存在ValidationMessages.properties
文件中,因此我们自定义时也应该创建该名字的文件名,不然读取不到默认消息。
二、创建ListConstraintValidator.class
类来定义校验规则。
public class ListConstraintValidator implements ConstraintValidator<ListValue, Byte> {
Set set = new HashSet<>();
@Override
public void initialize(ListValue constraintAnnotation) {
int[] value = constraintAnnotation.value();
for (int i : value) {
set.add(i);
}
}
@Override
public boolean isValid(Byte value, ConstraintValidatorContext context) {
return set.contains(value)? true:false;
}
}
说明:
1、该类必须实现ConstraintValidator
接口。原因是—点进@Constraint(validatedBy = {})里的validatedBy属性可以看到,是类的数组,且这些类应该实现ConstraintValidator
接口。
2、ConstraintValidator<ListValue, Byte>中第一个范型参数是自定义的注解名,第二个范型参数是被校验字段的类型。这里可以点进该接口查看该两个范型参数的说明。
3、isValid()方法的第一个参数为被校验字段的值。在该方法内定义校验规则
。
三、创建ValidationMessages.properties
文件来确定默认校验不通过时显示的消息,即在该文件内定义"{com.huang.gulimall.common.valid.ListValue.message}"
的值。
特别注意:文件名必须为该名字,不能改动,因为注解中message属性的默认值就是从该文件中获取的
。
新建好后,ValidationMessages.properties
文件中的内容如下:
com.huang.gulimall.common.valid.ListValue.message = 必须提交指定的值