我使用 JSR303 Bean Validation 来检查表单输入。
@NotBlank
@Size(min = 4, max = 30)
private String name;
@NotBlank
@Size(max = 100)
@Email
private String mail;
当name = '' and email = ''时,@NotBlank, @Size at name, @NotBlank, @Size, @Email at mail 将被检查。
我想设置检查顺序,例如,当上一个顺序无效时,下一个不检查。
@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 at name 和@NotBlank, @Size, @Email at mail 应该检查。因为name的@NotBlank无效,所以不检查name的@Size,而mail的@NotBlank,@Size有效,所以检查mail的@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有没有实现我的要求的好方法?