実際の挙動がイメージとちょっと違うのでメモる。
パターン1
バリデーショングループのインタフェースで javax.validation.groups.Default
を継承しないパターン。
interface Group {} @NotNull private String foo; @NotNull(groups = Group.class) private String bar;
Controller で @Validated
とする場合、groups
が未指定 or Default.class
を指定したアノテーションのフィールドがバリデーション対象になる。ここでは foo
のバリデーションが実行される。
一方、Controller で @Validated(Group.class)
とする場合、Group.class
を指定したアノテーションのフィールドがバリデーション対象になる。ここでは bar
のバリデーションが実行される。
パターン2
バリデーショングループのインタフェースで javax.validation.groups.Default
を継承するパターン。
interface Group extends Default {} @NotNull private String foo; @NotNull(groups = Group.class) private String bar;
Controller で @Validated
とする場合、groups
が未指定 or Default.class
を指定したアノテーションのフィールドがバリデーション対象になる。ここでは foo
のバリデーションが実行される。
一方、Controller で @Validated(Group.class)
とする場合、Group.class
を指定したアノテーションと groups
が未指定 or Default.class
を指定したアノテーションのフィールドがバリデーションの対象になる。ここでは foo
と bar
のバリデーションが実行される。
まとめ
当初、パターン2の挙動がイメージと違ってたんですが、こうやってまとめてみると別におかしくないですね...。Group インタフェースは Default インタフェースのサブインタフェースなので、is-a の関係になります。なので、パターン2において、Default を指定したときは Group.class
のアノテーションは対象外になるし、Group を指定したときは Default.class
と Group.class
のアノテーションが対象になるのは当たり前ですね。