我想逐步验证,也就是说,如果一个约束被剔除,下一个约束将不会被检查,我在模型中定义了这样的约束:
@NotEmpty
@Size(min = 4, max = 40)
private String password;
@NotEmpty
@Email
private String email;
对于这两个属性,验证结果不同,如果密码为空,则错误打印为:
Password cant be empty
Password must be between 4 and 40 characters
但是对于电子邮件,错误打印是:
Email cant be empty
对于电子邮件,结果是我想要的,但我不知道@Email约束与其他约束之间有什么区别,如果在hibernate内部代码中有@Email约束的某种特殊处理程序?
我想逐步验证,但我没有找到一个完美的方法,@ GroupSequence也不是一个好方案,我发现@Email有这个功能,但我不知道为什么@Email表现如此特别。
答案 0 :(得分:3)
空字符串不会导致@Email
检查失败。因此,email
属性只有@NotEmpty
的一个错误。
您可以使用以下方法之一来实现与您想要的类似的东西,但不完全是这样:
1- Enable failfast
。这将停止第一个无效属性的验证(其他属性将不会被验证)。
Validator validator = Validation.byProvider( HibernateValidator.class )
.configure()
.failFast( true )
.buildValidatorFactory()
.getValidator();
2-使用@ReportAsSingleViolation
注释创建复合约束。这将在第一个错误时停止对属性的验证,但是对于每个约束错误,您不能有不同的消息。
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Constraint(validatedBy = { })
@Documented
@Size(min = 4, max = 10)
@NotEmpty
@ReportAsSingleViolation
public @interface MyAnnotation {
String message() default "single.error.message";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
3- Use @GroupSequence
控制验证顺序,并在当前组失败时停止验证以下组。
答案 1 :(得分:0)
实际上,只有来自the previous answer的选项3才会执行您想要的操作。您需要意识到Java中的注释不是基于顺序的,并且无法保证如果以特定顺序放置注释,则在使用反射时将按顺序检索它们。使用Bean验证强制执行验证订单的唯一可靠方法是通过GroupSequence
功能。有讨论(BVAL-248)为即将推出的Bean Validation版本添加某种排序支持,但这仍未确定,当然也没有实现。