5

我使用 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有没有实现我的要求的好方法?

4

3 回答 3

6

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

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

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

@GroupSequence({ First.class, Second.class})
interface All {
}

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

这一切都在文档中。

于 2010-09-30T14:06:01.730 回答
2

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

@GroupSequence({NameFirst.class, NameSecond.class})
interface AllName {
}

@GroupSequence({MailFirst.class, MailSecond.class, MailThird.class})
interface AllMail {
}

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

validator.validate(myObject, AllName.class, AllMail.class)
于 2010-10-04T07:29:17.550 回答
2

在撰写此答案时,无法指定与验证相关的注释/约束的顺序。前段时间我已经向 Hibernate Validator 团队提交了与订单相关的问题,该问题已被接受,并且可能会在下一个 Bean Validation 规范版本中得到解决 - 在此处查看更多详细信息:http: //beanvalidation.org/proposals/BVAL- 248/顺便说一句,在简单的情况下,您可以通过使用注释的“非冲突”组合来避免“顺序冲突”,例如NotNull-Size大小将评估为真null值。

于 2015-02-07T22:34:47.933 回答