在日常代碼開發中,我們需要對實體類中的各個屬性進行校驗,比如非空判斷、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 【在這指定多個校驗器】}) 進行關聯