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



    前言

    我们都知道 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元注解

    从上往下,依次是:

    1. @Documented

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

    2. @Target

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

    3. @Retention

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

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


    使用

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

    后记

    没有后记,下午头疼。。

  • 相关阅读:
    UVA297:Quadtrees(四分树)
    hive查询ncdc天气数据
    hadoop-hive查询ncdc天气数据实例
    servlet课堂笔记
    servlet课堂笔记
    代码 c++实现动态栈
    代码 c++实现动态栈
    代码,用c++实现线性链表
    代码,用c++实现线性链表
    后海日记(8)
  • 原文地址:https://www.cnblogs.com/young-youth/p/11665599.html
Copyright © 2020-2023  润新知