JSR303 是 Java EE 6 中的一項子規範,叫做 Bean Validation,官方參考實現是hibernate Validator,有了它,我們可以在實體類的欄位上標註不同的註解實現對數據的校驗,不用 判斷,簡化了我們的開發,而且可讀性也很好。 但有時候它提供的註解並不能滿足我們的要求 ...
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
就可以工作了,當然這隻是很簡單的校驗,但方法大同小異。