如何解决匹配无效电子邮件地址的javax.validation.constraints.Email
.
根据验证者,不带电子邮件的电子邮件可能被视为有效。
通常,验证器实现(这里可能是Hibernate Validator)对电子邮件的限制不是很严格。
例如org.hibernate.validator.internal.constraintvalidators.AbstractEmailValidator
javadoc指出:
有效电子邮件的规范可以在RFC 2822中找到,并且可以提供一个正则表达式,该规范匹配符合规范的所有有效电子邮件地址。 此实现是一种折衷方案,它尝试匹配大多数电子邮件,而忽略例如带有双引号或注释的电子邮件。
另外,我注意到HTML Validator用于电子邮件的类似情况。
因此,我认为您实际遇到的行为是预期的。 关于你的问题:
我需要为@Email(regex =“”)传递自己的正则表达式实现吗?
确实。如果要使验证更具限制性,则别无选择。
作为替代方案,通过约束组合创建自己的验证程序的答案非常有趣,因为它是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 {};
}
解决方法
我有一个User
实体,其电子邮件属性带有注释@Email
@Email
private String email;
我@Valid
在我的Controller类上使用(javax.validation.Valid)批注。问题是控制器验证程序正在传递无效的电子邮件。示例:
pusp @ 1- 显然这是一个无效的电子邮件地址
pusp @ fake
我注意到的模式是,@Email
只需要 sometext @ text ,它不需要扩展名(.com /
org等)。这是预期的行为吗?我是否需要通过自己的正则表达式实现@Email(regex="")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。