它与Hibernate Validator @Email约束混淆了

时间:2014-11-30 06:14:22

标签: spring hibernate spring-mvc hibernate-validator

我想逐步验证,也就是说,如果一个约束被剔除,下一个约束将不会被检查,我在模型中定义了这样的约束:

@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表现如此特别。

2 个答案:

答案 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版本添加某种排序支持,但这仍未确定,当然也没有实现。