1

jsr 303 検証ルールの定義、つまりコンテナー Bean のデフォルト グループの再定義に苦労しています。

@GroupSequence({Container.class, Container.Step2.class})
public class Container {
@NotNull
private String def;

@Valid
@Size(min = 20, groups = Container.Step2.class)
private List<Element> elems = new LinkedList<Element>();

public interface Step2{}
}

public class Element{
@NotNull
private String foo;
}

次の場合にのみ、コンテナー Bean のサイズを検証したいと思います。

  • def プロパティは有効です
  • elems コレクションを使用する Elements Bean の検証エラーはありません

デフォルトグループでコンテナを検証する場合:

Container c = new Container();
...
validator.validate(c)

内部要素 Bean の検証エラーが発生した場合でも、サイズ バリデーターが起動されます。

コンテナ クラスから @GroupSequence を削除し (コンテナのデフォルト グループの再定義をスキップ)、独自の GroupSequence を次のように定義するとします。

@GroupSequence({Default.class, Container2.Step2.class}) 
public interface AllValid{}

次に、AllValid グループによる検証:

Container c = new Container();
...
validator.validate(c, Container2.AllValid.class);

すべてが期待どおりに機能します。何か案は?

4

1 に答える 1

0

問題を調査するために、hibernate-validatorのソースコードを調べることにしました。ルートBeanの検証後に、関連付けのカスケード検証が実行されているように見えます。両方の検証(ルートBeanと関連付けの検証)は、「ターゲットグループ」を使用して実行されます。「ターゲットグループ」とは、メソッドを検証するための最後の引数として渡すグループを意味します。group / groupsパラメータが渡されない場合、「デフォルトグループ」は「ターゲットグループ」として設定されます。私の場合、ルートBeanのデフォルトグループを再定義したので、次を呼び出します。

validator.validate(c)

コンテナBeanをグループシーケンス:Default、Container.Step2.classで強制的に検証します。その直後に、要素のリストが検証されます(デフォルトのグループを使用)。この場合、コンテナと要素は個別に検証されます。

デフォルトのグループで検証を機能させるためのトリックを知っている人がいる場合は、私の投稿にコメントしてください。ただし、今のところ、明示的なグループを使用したコンテナの検証を続けます。

validator.validate(c, Container2.AllValid.class);
于 2012-06-10T08:22:16.213 に答える