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