Наследование группы проверки JSR303 - PullRequest
3 голосов
/ 19 марта 2012

Учитывая следующие классы и интерфейсы

class A{
  @NotNull(groups=Section1.class)
  private String myString
}

interface All{}
interface Section1 extends All {}

При вызове

A a = new A ();validator.validate (a, All.class);

Я ожидаю, что он должен быть недействительным, поскольку myString имеет значение null, а группа notNull расширяет все, но не расширяет.Обратите внимание, что я использую Hibernate Impl (4.0.2.GA) валидатора

1 Ответ

6 голосов
/ 19 марта 2012

Ваши ожидания противоположны требованиям спецификации. Из spec (стр. 27 в PDF):

Для данного интерфейса Z ограничения, помеченные как принадлежащие группе Z (т. Е. Когда группы элементов аннотации содержат интерфейс Z) или любой из суперинтерфейсов Z (унаследованных групп), считаются частью группы Z.

Другими словами, если вы подтвердите с помощью Section1.class и пометите @NotNull с помощью All.class, будет применено ограничение. Но не наоборот.

Думайте об этом как о наборе: All является общим набором ограничений, и, расширяя All, Section1 становится надмножеством из All, а не подмножеством. Таким образом, когда вы проверяете, используя All, он применяет только те, которые определены в All и его суперинтерфейсах.

Если вы хотите, чтобы All был надмножеством ограничений, найденных в Section1, вам нужно перевернуть наследование:

interface All extends Section1 /*, Section2, Section3...*/ {}

В этом смысле вы можете сказать себе, что All наследует все ограничения Section1.

Это также разумная реализация, поскольку Java чрезвычайно затрудняет поиск того, кто расширяет определенный интерфейс (в конце концов, файл класса может даже не быть доступным, пока на него не ссылаются), но тривиально легко увидеть интерфейсы, которые данный интерфейс расширяется.

...