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的要求?
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)
一切都在文档中.