Validation 如何设置JSR303 bean验证的检查顺序

Validation 如何设置JSR303 bean验证的检查顺序,validation,bean-validation,Validation,Bean Validation,我使用JSR303bean验证来检查表单输入 @NotBlank @Size(min = 4, max = 30) private String name; @NotBlank @Size(max = 100) @Email private String mail; 当name=''和email=''时,@NotBlank、@Size at name、@NotBlank、, @将检查邮件中的@电子邮件大小 我想设置检查顺序,例如,当前一个顺序无效时,下一个不检查 @NotBlank(orde

我使用JSR303bean验证来检查表单输入

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

@NotBlank
@Size(max = 100)
@Email
private String mail;
当name=''和email=''时,@NotBlank、@Size at name、@NotBlank、, @将检查邮件中的@电子邮件大小

我想设置检查顺序,例如,当前一个顺序无效时,下一个不检查

@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在name和@NotBlank、@Size、@Email在mail中都应该检查。因为名称处的@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实现我的需求?

是的,Bean验证支持此功能。它被称为验证组和组序列。组是简单的标记接口,例如,您可以创建第一个和第二个接口,并将代码更改为以下内容:

@NotBlank(groups = First.class)
@Size(min = 4, max = 30, groups = Second.class)
private String name;
validator.validate(myObject, AllName.class, AllMail.class)
然后可以定义组序列:

@GroupSequence({ First.class, Second.class})
interface All {
}
获取验证程序并调用Validator.validate(myObject,All.class)


这些都在文档中。

您是否考虑过定义两个序列。一个是姓名,一个是邮件

在这种情况下,您可以这样调用验证器:

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

在编写此答案时,无法指定与验证相关的注释/约束的顺序。不久前我已经向Hibernate Validator团队提交了与订单相关的问题,该问题已被接受,可能会在下一个Bean验证规范版本中得到解决-请参阅此处的更多详细信息:顺便说一句,在简单的情况下,您可以通过使用“非冲突”注释组合来避免“订单冲突”,例如,
NotNull
Size
-对于
null
值,Size将计算为true。

非常感谢您的回复,组顺序不满足我的需要,我编辑了我的问题。