Как установить порядок проверки для проверки JSR303 bean-компонента

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

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

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

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

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

@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". Только @NotBlank в имени и @NotBlank в почте будут проверяться JSR303, поскольку @NotBlank в имени недопустим, поэтому вторая и третья группы не проверяются.

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

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

// 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?


person eckelcn    schedule 30.09.2010    source источник


Ответы (3)


Да 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)

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

person Hardy    schedule 30.09.2010
comment
Большое спасибо за ваш ответ, последовательность групп не соответствует моим потребностям, я редактирую свой вопрос. - person eckelcn; 01.10.2010

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

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

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

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

validator.validate(myObject, AllName.class, AllMail.class)
person Hardy    schedule 04.10.2010

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

person Pavla Nováková    schedule 07.02.2015