Наследование группы проверки JSR303

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

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

interface All{}
interface Section1 extends All {}

При звонке

A a = новый A (); validator.validate (a, All.class);

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


person dstarh    schedule 19.03.2012    source источник


Ответы (1)


Ваши ожидания не соответствуют требованиям спецификации. Из спецификации (стр. 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 чрезвычайно сложно выяснить, кто расширяет определенный интерфейс (в конце концов, файл класса может быть даже недоступен, пока на него не будет ссылаться), но тривиально легко увидеть интерфейсы, которые расширяет данный интерфейс. .

person Mark Peters    schedule 19.03.2012
comment
+1 за это красивое объяснение. Единственная проблема, с которой я столкнулся со всей концепцией, заключается в том, что я не могу расширить группу по умолчанию для моих разделов. Поэтому, когда я хочу, чтобы группа по умолчанию проверяла все, я должен добавлять это везде, где я использую другую группу. По крайней мере, я так думал. Только что вы видели, что вы можете переопределить группу по умолчанию: beanvalidation.org/1.0/spec/ < / а> - person Gandalf; 10.02.2015