javax.validation.constraints.Email匹配无效的电子邮件地址

时间:2018-05-25 18:47:37

标签: java spring-mvc spring-validator

我有一个User实体,其电子邮件属性已注明@Email

@Email
private String email;

我在Controller类上使用@Valid(javax.validation.Valid)注释。问题是控制器验证器正在传递无效的电子邮件。例如:
pusp @ 1 - 显然这是一个无效的电子邮件地址
pusp @假
我注意到的模式是@Email只想要 sometext @ text ,它不关心扩展名(.com / org等)。这是预期的行为吗?我是否需要为@Email(regex="")

传递自己的正则表达式实现

1 个答案:

答案 0 :(得分:6)

根据验证人的说法,没有.的电子邮件可能被视为有效 一般来说,验证器实现(这里可能是Hibernate验证器)对电子邮件的限制不是很严格。
例如org.hibernate.validator.internal.constraintvalidators.AbstractEmailValidator javadoc状态:

  

有效电子邮件的规范可在RFC 2822和一个中找到   可以提供匹配所有有效电子邮件的正则表达式   根据规范提供地址。 然而,正如this article所述   实现100%兼容的电子邮件不一定实用   验证器。这种实现是一种尝试与大多数人匹配的权衡   电子邮件,而忽略例如带双引号的电子邮件或   评论。

作为附注,我注意到HTML Validator用于发送电子邮件。

所以我认为你遇到的行为实际上是预期的行为 关于你的问题:

  

我是否需要为@Email传递自己的正则表达式实现(regex ="")

事实上。如果您想使验证更具限制性,则不会有任何其他选择 作为替代方案,这个answer通过约束组合创建自己的验证器非常有趣,因为它是DRY(您可以重复使用自定义ConstraintValidator,而无需在每次指定模式时指定)和它重用了"好的部分" @Email ConstraintValidator

@Email(message="Please provide a valid email address")
@Pattern(regexp=".+@.+\\..+", message="Please provide a valid email address")
@Target( { METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = {})
@Documented
public @interface ExtendedEmailValidator {
    String message() default "Please provide a valid email address";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}