• Springboot之自定义校验注解


      在日常代码开发中,我们需要对实体类中的各个属性进行校验,比如非空判断、url 判断等等,在 javax.validation.constraints.* 包下面集成了多个校验注解。但是随着业务的发展,我们需要自定义一些特殊的注解,比如,针对一些标志位,我们必须保证其 数值只是 Integer类型的 0 或者 1,这时需要我们自定义注解来进行实现。

      关于自定义注解,主要分为以下三步:1)自定义校验注解   2)自定义校验器   3)关联自定义的校验注解和校验注解器

      1)  自定义校验注解

      其中,需要指定 message信息,参考源码,在 resources 下面新建一个 ValidationMessages.properties 文件,其中指定com.demrystv.common.valid.ListValue.message=必须提交指定的值

    package com.demrystv.common.valid;
    
    import javax.validation.Constraint;
    import javax.validation.Payload;
    import javax.validation.constraints.NotBlank;
    import java.lang.annotation.Documented;
    import java.lang.annotation.Repeatable;
    import java.lang.annotation.Retention;
    import java.lang.annotation.Target;
    
    import static java.lang.annotation.ElementType.*;
    import static java.lang.annotation.ElementType.PARAMETER;
    import static java.lang.annotation.ElementType.TYPE_USE;
    import static java.lang.annotation.RetentionPolicy.RUNTIME;
    
    @Documented
    // 标明这个校验注解是使用哪个校验器进行校验的,在这里指定或者在初始化的时候指定
    @Constraint(validatedBy = { ListValConstraintValidator.class})
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })  // 作用位置
    @Retention(RUNTIME)  // 运行时机
    public @interface ListValue {
    
        //在 jsr303 中一个注解必须有下面三个属性
        String message() default "{com.demrystv.common.valid.ListValue.message}";
    
        Class<?>[] groups() default { };
    
        Class<? extends Payload>[] payload() default { };
    
    
        int[] vals() default { };
    }

      

      2)自定义校验器

     1 package com.demrystv.common.valid;
     2 
     3 import javax.validation.ConstraintValidator;
     4 import javax.validation.ConstraintValidatorContext;
     5 import java.util.HashSet;
     6 import java.util.Set;
     7 
     8 /**
     9  *
    10  *  自定义校验器
    11  *  首先必须实现 ConstraintValidator 接口, 其中第一个参数是 自定义校验注解,第二个参数是校验的类型
    12  */
    13 public class ListValConstraintValidator implements ConstraintValidator<ListValue, Integer> {
    14 
    15     Set<Integer> set = new HashSet<>();
    16     // 初始化方法
    17     @Override
    18     public void initialize(ListValue constraintAnnotation) {
    19         int[] vals = constraintAnnotation.vals(); // vals是注解中的设置的固定参数
    20         for (int val : vals) {
    21             set.add(val);
    22         }
    23     }
    24 
    25     /**
    26      * 进行校验
    27      * @param value  提交的需要被校验的值
    28      * @param context 上下文环境
    29      * @return
    30      */
    31     @Override
    32     public boolean isValid(Integer value, ConstraintValidatorContext context) {
    33         return set.contains(value);
    34     }
    35 }

      

      3)关联自定义的校验注解和校验注解器

      关联自定义的校验器和自定义的校验注解,自定义注解可以适配多个校验器,必须现在是校验 integer,以后是 double,只需要再编写一个校验器,在自定义校验注解的 @Constraint中进行指定即可;

      两者的关联主要是 在 自定义注解的  @Constraint(validatedBy = { ListValConstraintValidator.class 【在这指定多个校验器】}) 进行关联

  • 相关阅读:
    django media配置
    django model项目外操作
    django 快捷代码提示
    django静态文件路径配置
    selenium爬取网易云
    selenium
    pyquery
    beautifulsoup
    Kafka与.net core(三)kafka操作
    Oracle 日期类型timestamp(时间戳)和date类型使用
  • 原文地址:https://www.cnblogs.com/Demrystv/p/13178224.html
Copyright © 2020-2023  润新知