Как установить порядок проверки для проверки bean-компонента JSR303 - PullRequest
5 голосов
/ 30 сентября 2010

Я использую JSR303 Bean Validation для проверки ввода формы.

@NotBlank
@Size(min = 4, max = 30)
private String name;

@NotBlank
@Size(max = 100)
@Email
private String mail;

когда тогда name = '' и email = '' @ @NotBlank, @Size at name, @NotBlank, @Size, будет проверяться почта @ на почте.

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

@NotBlank(order = 1)
@Size(min = 4, max = 30, order = 2)
private String name;

(выше не поддерживается JSR303)

Есть ли способ реализовать его для использования JSR303? (Я думаю, что пользовательская аннотация будет готова, но я не люблю добавлять пользовательскую аннотацию для каждого свойства)

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

@NotBlank(groups = First.class)
@Size(min = 4, max = 30, groups = Second.class)
private String name;

@NotBlank(groups = First.class)
@Size(max = 100, groups = Second.class)
@Email(groups = Third.class)
private String mail;

Когда имя пустое и письмо "abc". JSR303 будет проверять только @NotBlank в имени и @NotBlank в почте, поскольку @NotBlank в имени недопустимо, поэтому вторая и третья группы не проверяются.

Но мне нужно @NotBlank для имени и @NotBlank, @Size, @Email для почты должны быть проверены. Поскольку @NotBlank at name недействителен, поэтому @Size at name не проверяется, а @ NotBlank, @ Size at mail действителен, поэтому проверяется @Email at mail.

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

// retrieves all fields and check one by one.
for (Field field : fields) {
  List annotations = getJsr303Annotations(field);
  // retrieves all annotations on field and check one by one.
  for (Annotation annotation : annotations) {
    CheckResult result = check(annotation, field);
    if (result.isValid()) {
       continue;
    } else {
       errors.add(result);
       break;
    }
  }
}

Есть ли хороший способ реализовать мое требование с помощью JSR303?

Ответы [ 3 ]

6 голосов
/ 30 сентября 2010

Да Bean Validation поддерживает эту функцию. Это называется валидацией групп и групповых последовательностей. Группы - это простые интерфейсы маркеров, например, вы можете создать два интерфейса Первый и Второй и изменить свой код примерно так:

@NotBlank(groups = First.class)
@Size(min = 4, max = 30, groups = Second.class)
private String name;

Затем вы можете определить групповую последовательность:

@GroupSequence({ First.class, Second.class})
interface All {
}

Получите Validator и вызовите validator.validate (myObject, All.class)

Это все в документации.

2 голосов
/ 08 февраля 2015

Порядок проверки связанных аннотаций / ограничений не может быть указан во время написания этого ответа.Я отправил проблему, связанную с заказами, в команду Hibernate Validator некоторое время назад, проблема была принята и, вероятно, будет решена в следующем выпуске спецификации проверки компонентов - подробности см. Здесь:можно избежать «конфликта заказов», используя «не конфликтующие» комбинации аннотаций, например, NotNull и Size - Размер будет иметь значение true для значения null.

1 голос
/ 04 октября 2010

Рассматривали ли вы определить две последовательности.Один для имя и один для почта ?

@GroupSequence({NameFirst.class, NameSecond.class})
interface AllName {
}

@GroupSequence({MailFirst.class, MailSecond.class, MailThird.class})
interface AllMail {
}

В этом случае вы бы назвали валидатор так:

...