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

问题描述

.根据验证者,不带电子邮件的电子邮件可能被视为有效。 通常,验证器实现(这里可能是Hibernate Validator)对电子邮件的限制不是很严格。 例如org.hibernate.validator.internal.constraintvalidators.AbstractEmailValidatorjavadoc指出:

有效电子邮件的规范可以在RFC 2822中找到,并且可以提供一个正则表达式,该规范匹配符合规范的所有有效电子邮件地址。 此实现是一种折衷方案,它尝试匹配大多数电子邮件,而忽略例如带有双引号或注释的电子邮件

另外,我注意到HTML Validator用于电子邮件的类似情况。

因此,我认为您实际遇到的行为是预期的。 关于你的问题:

我需要为@Email(regex =“”)传递自己的正则表达式实现吗?

确实。如果要使验证更具限制性,则别无选择。 作为替代方案,通过约束组合创建自己的验证程序的答案非常有趣,因为它是DRY(您可以重复使用自定义ConstraintValidator而无需在每次指定要包含的模式时都进行指定),并且可以重复使用@EmailConstraintValidator

@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 {};
}

解决方法

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

@Email
private String email;

@Valid在我的Controller类上使用(javax.validation.Valid)批注。问题是控制器验证程序正在传递无效的电子邮件。示例:
pusp @ 1- 显然这是一个无效的电子邮件地址
pusp @ fake
我注意到的模式是,@Email只需要 sometext @ text ,它不需要扩展名(.com /
org等)。这是预期的行为吗?我是否需要通过自己的正则表达式实现@Email(regex="")