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
就可以工作了,當然這只是很簡單的校驗,但方法大同小異。