自定义注解扩展springMvc的validation注解

版权声明:转载请给出原文链接 https://blog.csdn.net/youngyouth/article/details/86573294


前言

我们都知道 springMvc 的检验框架使用的是 hibernatevalidator ,检验数据,是有那么一点小爽快;

但是,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元注解

扫描二维码关注公众号,回复: 5070307 查看本文章

从上往下,依次是:

  1. @Documented

    表示定义的注解将被包含在 javadoc

  2. @Target

    定义的注解,可以使用在什么地方,这里可以使用在方法和字段上;

  3. @Retention

    表示定义的注解的保存策略,这里是在运行时也保存,这样可以通过反射获取到 ;

最后一个是 javax.validation 的注解 ,表示该注解的检验规则,有哪一个类实现;


使用

 	@IntegerValid(min = 9,max = 12,message = "{user.id.illegal}",groups = {Second.class})
    private Integer userId;

后记

没有后记,下午头疼。。

猜你喜欢

转载自blog.csdn.net/youngyouth/article/details/86573294
今日推荐