我有一个User
实体,其电子邮件属性已注明@Email
@Email
private String email;
我在Controller类上使用@Valid
(javax.validation.Valid)注释。问题是控制器验证器正在传递无效的电子邮件。例如:
pusp @ 1 - 显然这是一个无效的电子邮件地址
的 pusp @假
我注意到的模式是@Email
只想要 sometext @ text ,它不关心扩展名(.com / org等)。这是预期的行为吗?我是否需要为@Email(regex="")
答案 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 {};
}