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 = ".+[@].+[\.].+")
到您要验证的列。
我有一个 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 = ".+[@].+[\.].+")
到您要验证的列。