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

2022-09-03 00:17:07

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

@Email
private String email;

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


答案 1

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

可以在RFC 2822中找到有效电子邮件的规范,并且可以根据规范提出与所有有效电子邮件地址匹配的正则表达式。但是,正如本文所讨论的那样,实现100%兼容的电子邮件验证器不一定可行。此实现是一种权衡,试图匹配大多数电子邮件,同时忽略例如带有双引号或注释的电子邮件。

顺便说一句,我注意到HTML Validator对电子邮件也有类似的了解。

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

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

事实上。如果要使验证更具限制性,则没有任何其他选择。
作为替代方案,这个答案通过约束组合创建自己的验证器非常有趣,因为它是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 {};
}

答案 2

或者您可以简单地添加

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

添加到要验证的列。


推荐