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 【在這指定多個校驗器】}) 進行關聯

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM