11

複数の (カスタム) 内部制約と 1 つのクラスレベルの制約を持つ Bean クラスがあります。クラスレベルの制約の前に内部制約を検証したいと思います。コードは次のようになります。

@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 を次のように定義しようとすると

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

Outerランダムなインターフェースであるため)、例外が発生します:

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

s/o は、クラスレベルの制約が内部の制約の後に検証されることを確認する方法を知っていますか? (これはデフォルトではないようです! しばらくすると、ランダムにポップアップする問題が発生しました。)

4

1 に答える 1

16

これを試して:

@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はデフォルトグループの単なる代用です。BeanValidation仕様のセクション3.4.3も参照してください。

シーケンスは循環依存関係を持つことができないため、シーケンスの宣言でDefaultを使用することはオプションではありません。クラスAでホストされ、デフォルトグループに(デフォルトまたは明示的に)属する制約は、暗黙的にグループAに属します。

クラスAで定義されたシーケンス(つまり、クラスのデフォルトグループの再定義)には、グループAが含まれている必要があります。つまり、クラスでホストされているデフォルトの制約は、シーケンス定義の一部である必要があります。クラスAのデフォルトグループを再定義する@GroupSequenceにグループAが含まれていない場合、クラスの制約宣言および検証プロセスが検証されるとき、またはそのメタデータが要求されるときに、GroupDefinitionExceptionが発生します。

于 2012-04-30T13:59:22.200 に答える