javax.validation.constraints.Email匹配无效的电子邮件地址
我有一个javax.validation.constraints.Email匹配无效的电子邮件地址,java,spring-mvc,spring-validator,Java,Spring Mvc,Spring Validator,我有一个用户实体,其电子邮件属性用@email @Email private String email; 我正在控制器类上使用@Valid(javax.validation.Valid)注释。问题是控制器验证程序正在传递无效电子邮件。示例: pusp@1-显然这是一个无效的电子邮件地址 pusp@fake 我注意到的模式是,@电子邮件只想要sometext@text,它不关心扩展(.com/org等)。这是预期的行为吗?我是否需要为@Email(regex=“”)传递我自己的regex实现,根
用户
实体,其电子邮件属性用@email
@Email
private String email;
我正在控制器类上使用@Valid
(javax.validation.Valid)注释。问题是控制器验证程序正在传递无效电子邮件。示例:pusp@1-显然这是一个无效的电子邮件地址
pusp@fake
我注意到的模式是,
@电子邮件
只想要sometext@text,它不关心扩展(.com/org等)。这是预期的行为吗?我是否需要为@Email(regex=“”)
传递我自己的regex实现,根据验证程序,没有
的电子邮件可能被视为有效。一般来说,验证器实现(这里可能是Hibernate验证器)对电子邮件没有太多限制。
例如,javadoc声明: 有效电子邮件的规格可在和中找到 可以找到匹配所有有效电子邮件的正则表达式 地址符合规范要求但是,正如所讨论的那样 实施100%符合要求的电子邮件并不一定切实可行 验证程序。此实现是一种折衷方案,试图匹配大多数 忽略电子邮件,例如带有双引号或 评论 作为补充,我注意到了类似的事情,HTML邮件验证程序 所以我认为你遇到的行为实际上是你所期望的。
关于你的问题: 我是否需要为@Email(regex=“”)传递我自己的regex实现 的确如此。如果要使验证更具限制性,您没有其他选择。
作为替代方案,通过约束组合创建自己的验证器非常有趣,因为它是干的(您可以重用自定义的
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 {};
}
@电子邮件(message=“请提供有效的电子邮件地址”)
@模式(regexp=“.++.+\\..+”,message=“请提供有效的电子邮件地址”)
@目标({方法,字段,注释类型})
@保留(运行时)
@约束(validatedBy={})
@记录
public@interface ExtendedEmailValidator{
String message()默认为“请提供有效的电子邮件地址”;
类[]组()默认值{};
CLASS两个“明显无效”的地址实际上都是合法的(如果不是很有用的话)。