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

eck*_*lcn 5 validation bean-validation

我使用JSR303 Bean Validation来检查表单输入.

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

@NotBlank
@Size(max = 100)
@Email
private String mail;
Run Code Online (Sandbox Code Playgroud)

当name =''和email =''时,将检查@NotBlank,@ Size at name,@ NotBlank,@ Size,@ Email的邮件.

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

@NotBlank(order = 1)
@Size(min = 4, max = 30, order = 2)
private String name;
Run Code Online (Sandbox Code Playgroud)

(以上不是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;
Run Code Online (Sandbox Code Playgroud)

当名称为空并且邮件为"abc"时.JSR303仅检查名称上的@NotBlank和邮件中的@NotBlank,因为名称上的@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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

有没有一种很好的方法来实现JSR303的要求?

Har*_*rdy 6

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

@NotBlank(groups = First.class)
@Size(min = 4, max = 30, groups = Second.class)
private String name;
Run Code Online (Sandbox Code Playgroud)

然后你可以定义一个组序列:

@GroupSequence({ First.class, Second.class})
interface All {
}
Run Code Online (Sandbox Code Playgroud)

获取Validator并调用validator.validate(myObject,All.class)

一切都在文档中.