2012-04-30 15 views
6

私は複数の(カスタム)内部制約と1つのクラスレベル制約を持つ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が周りのどこかに横たわっているだけの空のインターフェースです)。

しかし、これを実行しようとすると、クラスレベルの制約はまったく検証されません。私は(Outerがランダムなインターフェイスである)

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

ようGroupSequenceを定義しようとすると、私は例外を取得:

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がちょうどスタンドですデフォルトグループのビーン検証仕様のセクションも3.4.3を参照してください:シーケンスが にデフォルトを使用して、円形の依存関係を持つことはできません

ので、シーケンスの宣言はオプションではありません。制約は、暗黙的にグループAに属しているクラスA 上でホストされていると(デフォルトまたは明示的に によって)デフォルトグループに属する

(すなわち、クラスの既定のグループに を再定義する)クラスAに定義されたシーケンスをしなければなりませんつまり、クラスにホストされているデフォルトの の制約は、シーケンス定義の一部でなければなりません。 クラスAのDefaultグループを再定義する@GroupSequenceに、グループAが含まれていない場合、GroupDefinitionExceptionが発生します。 クラスの妥当性検査が妥当性検査 またはメタデータの要求時にGroupDefinitionExceptionが発生します。優秀な答えに

+0

ただ、改善の提案:それはおそらく検証グループの方が良いです他の方法で回避: '@GroupSequence({NewSlotBean.class、ClassLevel.class})@TotalBeanValid(グループ= ClassLevel.class) 'を' NewSlotBean'クラスに追加し、InnerGroup'検証グループとフィールドレベルグループの割り当てを削除します。フィールドバリデーションは自動的にデフォルトの検証グループに割り当てられます。コードが少なく、クリーナー。 – jannis

関連する問題