Я использую 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?