Java / Spring MVC 3 验证电子邮件地址

Posted

技术标签:

【中文标题】Java / Spring MVC 3 验证电子邮件地址【英文标题】:Java / Spring MVC 3 validation of an email address 【发布时间】:2011-06-08 03:54:46 【问题描述】:

我有一个带有 Spring MVC 的 Java 后端,并且我正在我的域对象上使用这种方式验证电子邮件地址:

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
...
@NotNull
@Size(min = 1, max = 100)
@Pattern(regexp="^([a-zA-Z0-9\\-\\.\\_]+)'+'(\\@)([a-zA-Z0-9\\-\\.]+)'+'(\\.)([a-zA-Z]2,4)$")
private String email;

但我得到的只是这些代码行

Set<ConstraintViolation<Person>> failures = validator.validate(personObject);
...
Map<String, String> failureMessages = new HashMap<String, String>();
for (ConstraintViolation<Person> failure : failures) 
    failureMessages.put(failure.getPropertyPath().toString(), failure.getMessage());
    System.out.println(failure.getPropertyPath().toString()+" - "+failure.getMessage())

我在控制台上得到了这个:

email - must match "^([a-zA-Z0-9\\-\\.\\_]+)'+'(\\@)([a-zA-Z0-9\\-\\.]+)'+'(\\.)([a-zA-Z]2,4)$"

但我有电子邮件地址test@test.com,所以正则表达式不匹配。

所以我有两个问题:

这里有什么问题? 我怎样才能自己定义错误消息,因为向用户显示这不是一件好事:-)

提前感谢您的帮助和最诚挚的问候。

【问题讨论】:

你使用的是什么版本的 Spring MVC? 【参考方案1】:

首先尝试更简单的正则表达式,例如:

"\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]2,4\\b"

你可以试试 RFC 2822 版本:

"(?:[a-z0-9!#$%&'*+/=?^_`|~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`|~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.)3(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"

让我知道是否适合你。

也看看这个包

org.springmodules.validation.bean.conf.loader.annotation.handler

这里http://www.springbyexample.org/examples/spring-modules-validation-module.html

这可能是更好的选择。

【讨论】:

第二个有效,但我得到另一个错误...我必须看看是什么问题javax.validation.ConstraintViolationException: validation failed for classes [com.mydomain.myproject.domain.Person] during update time for groups [javax.validation.groups.Default, ] 但没有回应。我在这里创建了一个问题:***.com/questions/4675204/…,因为我不知道为什么会发生此错误。如果我检查对象,没有失败,但在提交对象进行更新时,就会发生错误。 我更新了新问题。仅当我将 @Pattern 放入我的 Person 域对象时,才会出现新问题。【参考方案2】:

您的正则表达式中有几个 '+' 实例,这有点奇怪。电子邮件地址通常不需要在其中包含单引号 :) 我认为这可能是为了连接字符串的片段,而那些应该是双引号?

要定义您自己的消息,您只需将message="someWay.of.definingCodes" 添加到注释中。然后在默认包的ValidationMessages.properties中为它定义一个翻译。

如果您愿意依赖供应商扩展,也可以使用休眠验证器提供 org.hibernate.validator.Email

【讨论】:

我添加了消息,并在我的 WEB-INF/messages 文件夹中创建了一个 ValidationMessages.properties 文件,其内容为:someWay.of.definingCodes=test。但结果是someWay.of.definingCodes 而不是test... 默认包一般位于WEB-INF\classes :) 哦,好吧,在我的 Eclipse IDE 中,WEB-INF\classes 目录似乎是空的,因为我无法打开它。我应该在其中创建一个名为 ValidationMessages.properties 的新文件吗? 通常你会把它留在源代码中,然后让构建过程将它移到那里。如果您使用的是 Maven,您可以将其放在资源目录中。否则就在您的来源的根目录。 我用的是Maven,我把它放到resources文件夹下,就可以了,谢谢!【参考方案3】:

如果您使用Hibernate Validator,则可以使用@Email annotation 无论如何,您可以创建自定义约束注释并设置自定义消息以显示在资源属性文件中。

【讨论】:

+1 我强烈建议使用预构建的@Email 注释。自己做这件事没有意义。 我添加了@Email 注释,相信它会自动管理所有内容。我错了。如果我必须添加@Pattern,那么使用这个注释有什么意义? 将 hibernate-validator.jar 添加到您的类路径中(如果使用 Maven 检查 Bassem 的答案)。它将自动拦截使用@Email 注释注释的任何字段或属性。 @Email 注释告诉我“john@test”是一个有效的电子邮件地址。这个答案解释了原因:***.com/questions/4459474/… @Email 也接受null and empty string as valid。因此,您可能还想添加@NotNull 和@NotEmpty。【参考方案4】:

您可以从Hibernate Validator 使用@Email

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.4.1.Final</version>
    </dependency>

【讨论】:

@Email 有问题。看看这个问题。 ***.com/questions/50535214/…

以上是关于Java / Spring MVC 3 验证电子邮件地址的主要内容,如果未能解决你的问题,请参考以下文章

如何将跨域资源共享与 Spring MVC 4.0.0 RESTful Webservice 集成

Spring 3 MVC:使用自定义验证器显示验证消息

对 ASP.Net MVC 验证进行故障排除?电子邮件验证电话不

使用 Spring MVC 控制器处理和验证 HTML 复选框

使用休眠验证器的 Spring mvc 表单验证

ASP.NET MVC 客户端电子邮件验证不起作用