【问题标题】:It's so confused with the Hibernate Validator @Email constraint它与 Hibernate Validator @Email 约束非常混淆
【发布时间】:2014-11-30 06:14:22
【问题描述】:

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

@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 约束和其他约束有什么区别,如果在休眠内部代码中有一些针对@Email 约束的特殊处理程序?

我想一步一步验证,但我没有找到完美的方法,@GroupSequence 也不是一个好的方案,我发现@Email 有这个功能,但我不知道为什么@Email表现得如此特别。

【问题讨论】:

  • 实际上这两个验证也都用于电子邮件。当您查看EmailValidator 源代码时,它会将空或空字符串视为有效...
  • 哦,Bohuslav,我明白了,我知道@Email 约束的原因了,非常感谢!

标签: spring hibernate spring-mvc hibernate-validator


【解决方案1】:

空字符串不会使@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控制验证的顺序,当当前组失败时停止验证后面的组。

【讨论】:

    【解决方案2】:

    实际上,只有the previous answer 中的选项 3 可以满足您的需求。您需要意识到 Java 中的注解不是基于顺序的,并且无法保证如果您按特定顺序放置注解,则​​在使用反射时它们将按该顺序检索。使用 Bean Validation 强制执行验证顺序的唯一可靠方法是通过 GroupSequence 功能。有讨论 (BVAL-248) 为即将发布的 Bean Validation 版本添加某种排序支持,但这仍未决定,当然也没有实施。

    【讨论】:

      【解决方案3】:

      我知道很久以前就已经成功回答了这个问题,但我想补充一点,最简单的方法是不要在同一个字符串字段上混合 @Size 和 @NotEmpty。

      如果 Size 说“不能小于min”,而 NotEmpty 说“不能小于一个”,那么它们的职责重叠,您会看到两个错误。

      @Email 字段很好,因为如上所述,null 和 "" 被认为是有效的电子邮件地址,因此这里没有重叠。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-06
        相关资源
        最近更新 更多