SpringBoot 使用 JSR303 自定義校驗注解


JSR303 是 Java EE 6 中的一項子規范,叫做 Bean Validation,官方參考實現是hibernate Validator,有了它,我們可以在實體類的字段上標注不同的注解實現對數據的校驗,不用 if-else 判斷,簡化了我們的開發,而且可讀性也很好。

但有時候它提供的注解並不能滿足我們的要求,比如,我們要求字段 color 必須是「red,blue,yellow」這三個值之一,這時候,我們就需要自己寫判斷的邏輯了,你可以自定義一個方法在其他地方進行判斷,但既然用了 JSR303,為了統一代碼,可以自定義校驗注解。

1、給字段 color 上標注自定義注解 @ListValue,寫上這幾個值

@ListValue(vals = {"red", "blue", "yellow"})
private String color;

2、創建注解 @ListValue,可以參考官方的注解,比如 @NotNull,我們只需要修改下面注釋的幾處即可

//自定義的約束校驗器
@Constraint(validatedBy = {ListValueConstraintValidator.class}) 
@Documented
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
public @interface ListValue {

    //配置文件中錯誤提示信息的名稱
    String message() default "{com.sjl.common.valid.ListValue.message}"; 

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
	
    //自定義值的類型
    String[] vals() default {};
}

3、創建自定義約束校驗器,繼承 ConstraintValidator,第一個泛型是自定義注解、第二個是校驗值的類型,也即注解標注的字段的類型

public class ListValueConstraintValidator implements ConstraintValidator<ListValue,String>{
    
    private static Set<String> set = new HashSet<>();

    @Override
    public void initialize(ListValue constraintAnnotation) {
        for (String val : constraintAnnotation.vals()) {
            set.add(val);
        }
    }

    /**
     * 判斷是否通過校驗
     *
     * @param value   傳入的值
     * @param context
     * @return
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        return set.contains(value);
    }
}

4、在 resources 目錄下創建一個 ValidationMessages.properties 配置文件,key 是第二步 message 設置的默認值,value 是自定義錯誤信息

com.sjl.common.valid.ListValue.message=必須提交指定的值

至此,所有的工作都已完成,自定義注解 @ListValue 就可以工作了,當然這只是很簡單的校驗,但方法大同小異。


免責聲明!

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



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