zoukankan      html  css  js  c++  java
  • 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 【在这指定多个校验器】}) 进行关联

  • 相关阅读:
    什么是 bean 的自动装配?
    什么是 Spring 的内部 bean?
    什么是 Spring 的 MVC 框架?
    Spring AOP and AspectJ AOP 有什么区别?
    解释 JDBC 抽象和 DAO 模块?
    volatile 类型变量提供什么保证?
    一个 Spring Bean 定义 包含什么?
    什么是 Spring MVC 框架的控制器?
    使用 Spring 访问 Hibernate 的方法有哪些?
    什么是 Callable 和 Future?
  • 原文地址:https://www.cnblogs.com/Demrystv/p/13178224.html
Copyright © 2011-2022 走看看