SpringBoot 使用 JSR303 自定義校驗註解

JSR303 是 Java EE 6 中的一項子規範,叫作 Bean Validation,官方參考實現是hibernate Validator,有了它,咱們能夠在實體類的字段上標註不一樣的註解實現對數據的校驗,不用 if-else 判斷,簡化了咱們的開發,並且可讀性也很好。java

但有時候它提供的註解並不能知足咱們的要求,好比,咱們要求字段 color 必須是「red,blue,yellow」這三個值之一,這時候,咱們就須要本身寫判斷的邏輯了,你能夠自定義一個方法在其餘地方進行判斷,但既然用了 JSR303,爲了統一代碼,能夠自定義校驗註解。ide

一、給字段 color 上標註自定義註解 @ListValue,寫上這幾個值hibernate

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

二、建立註解 @ListValue,能夠參考官方的註解,好比 @NotNull,咱們只須要修改下面註釋的幾處便可code

//自定義的約束校驗器
@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 {};
}

三、建立自定義約束校驗器,繼承 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);
    }
}

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

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

至此,全部的工做都已完成,自定義註解 @ListValue 就能夠工做了,固然這只是很簡單的校驗,但方法大同小異。get

相關文章
相關標籤/搜索