JSR 303 Пользовательское ограничение Переопределение - PullRequest
7 голосов
/ 06 декабря 2011

Я хочу поместить набор стандартных ограничений (например, ненулевую буквенно-цифровую строку длиной от 3 до 240 символов) в поля (в данном случае строку) и хочу знать, есть ли способ переопределить некоторые из этих ограничений вкод модели.Кроме того, это будет переопределение или просто проверка дважды для переопределенной аннотации?

должно быть что-то вроде этого

@AlphanumericString
@Size(min=100, max=150) //override standart values from AlphanumericString annotation

спасибо за ваши ответы

ок,ответь сам.есть @OverridesParameter, который помогает переназначить вложенный параметр аннотации

@Numerical
@Size //arbitrary parameter values
@ConstraintValidator(FrenchZipcodeValidator.class)
@Documented
@Target({ANNOTATION_TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface FrenchZipCode {
    String message() default "Wrong zipcode";
    String[] groups() default {};

    @OverridesParameters( {
        @OverridesParameter(constraint=Size.class, parameter="min")
        @OverridesParameter(constraint=Size.class, parameter="max") } )
    int size() default 5;

    @OverridesParameter(constraint=Size.class, parameter="message")
    String sizeMessage() default "{error.zipcode.size}";

    @OverridesParameter(constraint=Numerical.class, parameter="message")
    String numericalMessage() default "{error.zipcode.numerical}";
}

source

1 Ответ

5 голосов
/ 06 декабря 2011

Хороший вопрос.Спецификация JSR 303 Bean Validation описывает процедуру проверки в разделе 3.5.

Для проверки заданной группы процедура проверки, примененная к данному экземпляру компонента, должна выполнитьследующие проверки ограничений в произвольном порядке:

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

...

Подпрограмма проверки объекта описывается как таковая.Для каждого объявления ограничения:

  • определяет для объявления ограничения соответствующий ConstraintValidator для использования (см. Раздел 3.5.3).
  • выполняет операцию isValid (из реализации проверки ограничения)на соответствующих данных (см. раздел 2.4)
  • , если isValid возвращает true, переходите к следующему ограничению,
  • , если isValid возвращает false, поставщик проверки бинов заполняет объект (ы) ConstraintViolation в соответствии справила, определенные в разделе 2.4, и добавляет эти объекты в список нарушений ограничений.

В вашем случае вы имеете дело с проверкой простого поля String, где целевая группа Default.У вас есть два ограничения проверки (@AlphanumericString и @Size), которые в соответствии с документацией будут проверяться / обрабатываться отдельно в произвольном порядке.

Итак, чтобы ответить на ваш вопрос.Нет, к вашему @AlphanumericString не будет применено переопределение, когда вы дополнительно используете @Size.Чтобы достичь того, что, как я думаю, вы пытаетесь сделать, вы можете создать композицию ограничений , где вы переопределяете атрибуты, создавая аннотации следующим образом:

@Pattern(regexp="[a-zA-Z]*")
@Size
@Constraint(validatedBy = AlphanumericStringValidator.class)
@Documented
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
public @interface AlphanumericString {
   // ...
  @OverridesAttribute(constraint=Size.class, name="min")
  int min() default 3
  @OverridesAttribute(constraint=Size.class, name="max")
  int max() default 230;       
   // ...
}

и используйте его следующим образом:

@AlphanumericString(min = 100, max = 150)
...