前言
我们都知道 springMvc
的检验框架使用的是 hibernate
的 validator
,检验数据,是有那么一点小爽快;
但是,validator
提供的注解,总有那么一点不能适应我们的需求的;
比如前台传来一个 User
对象,我们对其各个字段进行校验,validator
本身已经有诸多的注解来完成校验了,但是需要对 用户ID
进行校验,也就是对 基本数据类型
进行校验,没有找到合适的注解;
自定义校验注解
实现对 int
类型数据进行校验,其中校验规则,自定义,我这里设定的是,根据传入的 min 和 max 判定是否满足条件 ;
default
的含义是,如果此属性在注解中,没有明确的赋值,则使用在开发注解的时候的赋予的默认值;
@Documented
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { IntegerValidImpl.class})
public @interface IntegerValid {
// 在注解没有显示申明,则min值默认是 0
int min() default 0;
// 在注解没有显示申明,则min值默认是 2147483647
int max() default 2147483647;
// 错误信息
String message() default "{不合法的int}";
// 分组信息
Class<?>[] groups() default {};
// 不知道是干嘛的。。。
Class<? extends Payload>[] payload() default {};
}
/**
* 自定义类,用于对校验注解规则的实现
* 实现 ConstraintValidator 接口,泛型,第一个是对什么注解进行实现,第二个是检验的数据的数据类型 ;
*/
class IntegerValidImpl implements ConstraintValidator<IntegerValid, Integer> {
private int min;
private int max;
/**
* 初始化方法,在里面进行一些设定,我在这里获取注解中属性值,方法参数,就是上面泛型参数的第一个参数 ;
*/
@Override
public void initialize(IntegerValid integerValid) {
max = integerValid.max();
min = integerValid.min();
}
/**
* 第一个参数,就是泛型参数的第二个参数 ;
*
* 进行检验,返回 false 代表校验没通过,返回 true 代表校验通过
*/
@Override
public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
if (null == integer) {
return false;
} else if (integer > max || integer < min) {
return false;
}
return true;
}
}
其中自定义 校验
注解 (看仔细了,不是自定义注解,是自定义检验注解) 的时候,message() ,groups() ,payload()
三个是必须有的;
其他属性根据自己需要进行添加,我这里添加了两个: min
max
;
类上的注解:
@Documented
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { IntegerValidImpl.class})
前三个是 java
的 元注解
;
从上往下,依次是:
-
@Documented
表示定义的注解将被包含在
javadoc
中 -
@Target
定义的注解,可以使用在什么地方,这里可以使用在方法和字段上;
-
@Retention
表示定义的注解的保存策略,这里是在运行时也保存,这样可以通过反射获取到 ;
最后一个是 javax.validation
的注解 ,表示该注解的检验规则,有哪一个类实现;
使用
@IntegerValid(min = 9,max = 12,message = "{user.id.illegal}",groups = {Second.class})
private Integer userId;
后记
没有后记,下午头疼。。