2011-12-06 123 views
7

我想在字段(字符串在這種情況下)放置一組標準約束(如非空字母數字字符串長度從3到240個字符),並想知道是否有一種方法來重寫一些模型代碼中的這個約束。此外,這將是一個壓倒一切的,或者只是驗證兩次overrided註釋?JSR 303自定義約束覆蓋

它應該是這個

@AlphanumericString 
@Size(min=100, max=150) //override standart values from AlphanumericString annotation 

感謝像你的回答

OK,回答自己。有@OverridesParameter至極有助於重新分配嵌套註釋參數

@Numerical 
@Size //arbitrary parameter values 
@ConstraintValidator(FrenchZipcodeValidator.class) 
@Documented 
@Target({ANNOTATION_TYPE, METHOD, FIELD}) 
@Retention(RUNTIME) 
public @interface FrenchZipCode { 
    String message() default "Wrong zipcode"; 
    String[] groups() default {}; 

    @OverridesParameters({ 
     @OverridesParameter(constraint=Size.class, parameter="min") 
     @OverridesParameter(constraint=Size.class, parameter="max") }) 
    int size() default 5; 

    @OverridesParameter(constraint=Size.class, parameter="message") 
    String sizeMessage() default "{error.zipcode.size}"; 

    @OverridesParameter(constraint=Numerical.class, parameter="message") 
    String numericalMessage() default "{error.zipcode.numerical}"; 
} 

source

回答

5

這是一個很好的問題。 JSR 303 Bean Validation specification描述了3.5節中的驗證程序。

對於給定的組來驗證,施加在 定bean實例的驗證例程預計在沒有特定的順序執行下面的約束 驗證:

  • 對於所有可達字段,執行所有除非在給定導航路徑 (參見第3.5.1節)的此驗證例程期間處理的給定驗證約束已經爲 作爲以前的一部分,否則將與目標 組匹配的字段級驗證(包括超類中表示的驗證約束)小組賽。

...

目的驗證例程被描述爲這樣。對於每個 約束聲明:

  • 確定的約束聲明,適當ConstraintValidator使用(參見3.5.3節)。
  • 在適當的數據執行的isValid操作(從約束驗證實現)(參見2.4節)
  • 如果isValid方法返回true,繼續下一個約束,
  • 如果isValid方法返回false,Bean驗證提供者填充ConstraintViolation對象根據2.4節中定義的規則並將這些對象附加到約束違規列表。

在你的情況,你處理一個簡單的String場,其中目標羣體是Default的驗證。你有兩個驗證約束條件(@AlphanummericString和@Size),根據文檔將被驗證/處理分別沒有特定的順序。

所以要回答你的問題。不,當您使用@Size additionaly時,將不會覆蓋您的@AlphanumericString。爲了能夠達到什麼樣的,我認爲你試圖這樣做,你可以創建一個約束組成,你overridde從撰寫的註釋一樣,屬性:

@Pattern(regexp="[a-zA-Z]*") 
@Size 
@Constraint(validatedBy = AlphanumericStringValidator.class) 
@Documented 
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
@Retention(RUNTIME) 
public @interface AlphanumericString { 
    // ... 
    @OverridesAttribute(constraint=Size.class, name="min") 
    int min() default 3 
    @OverridesAttribute(constraint=Size.class, name="max") 
    int max() default 230;  
    // ... 
} 

,並使用它像:

@AlphanumericString(min = 100, max = 150) 
+0

感謝,已經想通了,會嘗試使用這種方法,你能否建議我加快驗證的方法,除了每個應用程序僅對驗證工廠實例化一次,將驗證分爲組並將其從更快到更慢的處理時間排序? – Pilgrim