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