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

Tim*_*Tim 21 java validation spring-mvc

我有一个带有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;
Run Code Online (Sandbox Code Playgroud)

但是我得到了这些代码

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())
}
Run Code Online (Sandbox Code Playgroud)

我在控制台上得到这个:

email - must match "^([a-zA-Z0-9\\-\\.\\_]+)'+'(\\@)([a-zA-Z0-9\\-\\.]+)'+'(\\.)([a-zA-Z]{2,4})$"
Run Code Online (Sandbox Code Playgroud)

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

所以我有两个问题:

  • 这有什么不对?
  • 我怎么能自己定义一个错误信息,因为这个显示给用户,这不是一件好事:-)

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

Jav*_*avi 43

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

  • @Email还接受[`null`和空字符串为有效](https://github.com/hibernate/hibernate-validator/blob/master/engine/src/main/java/org/hibernate/validator/internal/constraintvalidators /AbstractEmailValidator.java#L51)。因此,您可能还想添加@NotNull和@NotEmpty。 (4认同)
  • 我添加了`@ Email`注释,相信它会自动管理所有内容.我错了.如果我必须添加一个`@ Pattern`,那么使用这个注释的意义是什么? (2认同)

Mat*_* B. 9

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

"\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b"
Run Code Online (Sandbox Code Playgroud)

比你可以尝试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])+)\\])"
Run Code Online (Sandbox Code Playgroud)

如果这两个都适合你,请告诉我.

另外看看这个包

org.springmodules.validation.bean.conf.loader.annotation.handler
Run Code Online (Sandbox Code Playgroud)

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

这可能是更好的选择.


Bas*_*hdy 6

您可以使用@EmailHibernate验证:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.4.1.Final</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)