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

javax.validation.constraints.Email matching invalid email address

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

注释
@Email
private String email;

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

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

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

The specification of a valid email can be found in RFC 2822 and one can come up with a regular expression matching all valid email addresses as per specification. However, as this article discusses it is not necessarily practical to implement a 100% compliant email validator. This implementation is a trade-off trying to match most email while ignoring for example emails with double quotes or comments.

作为旁注,我注意到 HTML 电子邮件验证器也有类似的事情。

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

Do I need to pass my own regex implementation for @Email(regex="")

确实如此。如果您想让验证更具限制性,您别无选择。
作为替代方案,这个 answer 通过约束组合创建自己的验证器非常有趣,因为它是 DRY(您可以重用您的自定义 ConstraintValidator 而无需每次都指定模式,因为它将包含在其中)和它重用 @Email ConstraintValidator 的 "good part" :

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

或者您可以简单地添加

@Email(regexp = ".+[@].+[\.].+")

到您要验证的列。