2012-04-30 77 views
6

我有多個(自定義)bean類內部約束和一個類級別的約束。我想在類級約束之前驗證內部約束。代碼如下所示:的Java Bean驗證:GroupSequence與類級別的約束

@GroupSequence({ Inner.class, NewSlotBean.class }) 
@TotalBeanValid(groups = NewSlotBean.class) 
public class NewSlotBean { 

    @DayMonthYearString(groups = Inner.class) 
    private String slotDay; 

    @TimeString(groups = Inner.class) 
    private String slotBegin; 

    @LengthString(groups = Inner.class) 
    private String slotLength; 
} 

Inner只是一個空的接口,位於某處)。

然而,當我嘗試運行此,類級別的約束沒有得到根本驗證。當我嘗試這樣定義

@GroupSequence({ Inner.class, Outer.class }) 

的GroupSequence(與Outer是一個隨機接口),我得到異常:

javax.validation.GroupDefinitionException: ...*.beans.NewSlotBean must be part of the redefined default group sequence. 

是否S/O知道如何確保類級別約束在內部之後被驗證? (!這不是似乎是默認的我已經隨機問題,它一會兒後彈出)

回答

10

試試這個:

@GroupSequence({ Inner.class, NewSlotBean.class }) 
@TotalBeanValid(groups = Default.class) 
public class NewSlotBean { 

    @DayMonthYearString(groups = Inner.class) 
    private String slotDay; 

    @TimeString(groups = Inner.class) 
    private String slotBegin; 

    @LengthString(groups = Inner.class) 
    private String slotLength; 
} 

根據規範NewSlotBean只是一項獨立在默認組中。請參閱Bean驗證規範的第3.4.3節:

由於序列不能具有循環依賴性,因此使用 中的默認值,序列的聲明不是選項。約束託管在 A類和屬於默認組(默認或 明確)隱含屬於A組

在A類中定義(即重新定義了默認組 的類)的序列必須包含組A.換言之,託管在類上的默認約束必須是序列定義的一部分。 如果@GroupSequence爲類A重新定義默認組, 不包含組A,當 約束聲明和驗證過程類驗證 或請求其元數據時,會引發GroupDefinitionException。

+0

只是一個改進建議,以優良的答案:它是驗證的其他方式可能更好地組: '@GroupSequence({NewSlotBean.class,ClassLevel.class})@TotalBeanValid(組= ClassLevel.class) 'NewSlotBean'類,然後刪除'InnerGroup'驗證組和字段級別組賦值 - 字段驗證自動分配給默認驗證組。代碼少,清潔。 – jannis

相關問題