Почему группа ограничений пользовательской аннотации JSR303 по умолчанию должна быть пустым массивом?

Я пишу собственный валидатор для определенной группы ограничений (не по умолчанию), но среда выполнения выдает следующую ошибку.

Мне просто любопытно, почему им нужно, чтобы значения по умолчанию были пустыми. Благодарю, если вы можете поделиться своим мнением. Спасибо :)

xxx.model.validation.CustomValidation содержит аннотацию Constraint, но значение по умолчанию параметра groups не является пустым массивом.

StackTrace: org.hibernate.validator.metadata.ConstraintHelper.assertGroupsParameterExists(ConstraintHelper.java:335) org.hibernate.validator.metadata.ConstraintHelper.isConstraintAnnotation(ConstraintHelper.java:282)


person The Huy    schedule 02.08.2012    source источник


Ответы (1)


Я не могу понять, в каком случае может быть полезно привязать ограничение к определенной группе.

Группа используется для частичной проверки (и проверки последовательности). Если у вас есть 10 полей в классе, вы можете отметить 8 из них знаком A и 2 знаком B. Затем вы можете проверить только поля в группе A или в группе B. И наоборот, вы хотите, чтобы @MyConstraint принадлежал к определенной группе с именем C. Это не имеет никакого смысла. Группа — это более или менее имя, используемое для отличия одних полей от других в том же классе. Это не имеет абсолютного значения. Группы полезны при проверке, а не при определении ограничений, они связаны с полями, а не с ограничениями.

Кроме того, если вы скроете имя группы в определении ограничения, вы можете столкнуться с ошибками, потому что вы можете подумать, что поля проверены все вместе.

@Email
private String mail;

@Password
private String pass;

@VAT
private String vatCode;

Вы можете увидеть, есть ли частичная проверка?

ИЗМЕНИТЬ

Что касается второго комментария: предположим, у вас есть класс с 5 полями без каких-либо ограничений. Три из них целые. Если вы хотите проверить сумму этих трех полей, вы должны создать ограничение на уровне класса, как вы предлагаете. Таким образом, ваша пользовательская аннотация применяется к классу, а не к полям, поэтому как вы можете определить группы в полях?

Вместо этого вы можете использовать что-то вроде этого:

@Sum(min = 250, fields = {"length", "width", "height"})
public class MyClass {
    private String type;
    private String code;
    private int length;
    private int width;
    private int height;
        ...
}
person Alf    schedule 02.08.2012
comment
Спасибо Альф. Ваше последнее замечание о скрытии имени группы в определении ограничения, из-за которого вы можете столкнуться с ошибками, достаточно верно. Это действительно неотличимо, если @VAT был пользовательским ограничением с группой по умолчанию, отличной от группы по умолчанию, что вызывало путаницу и ошибки. - person The Huy; 03.08.2012
comment
Я не очень понимаю ваш первый пункт, хотя. У меня есть поля с группой A, B, представляющие разные наборы правил проверки. Однако для группы B есть некоторая пользовательская проверка, которую мне нужно выполнить для нескольких полей (например, их сумма должна быть выше некоторого минимума), поэтому я написал собственный валидатор/ограничение для самой модели (т.е. Target: ElementType.TYPE). Этот пользовательский валидатор предназначен ТОЛЬКО для группы B, поэтому я попытался поставить B в качестве группы ограничений по умолчанию. - person The Huy; 03.08.2012