Java / Spring MVC 3 validation of an email address

2020-05-25 08:18发布

I have a Java backend with Spring MVC and I am using validation in this way on my domain object for an email address:

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;

But all I get with these lines of code

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())
}

I get this on the console:

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

but I have as email address test@test.com, so the regexp does not match.

So I have two prolems:

  • What's wrong here?
  • And how can I define a error message on my own, because display this to the user, that is not a good thing :-)

Thank you in advance for your help and Best Regards.

4条回答
ゆ 、 Hurt°
2楼-- · 2020-05-25 08:27

Your regex has a couple of instances of '+' in it, which is kind of odd. e-mail addresses aren't usually required to have single quotes in them :) I think perhaps that is meant to be concatenating pieces of the String, and those should be double quotes?

For defining your own message, you just add message="{someWay.of.definingCodes}" to the annotation. Then define a translation for it in ValidationMessages.properties in the default package.

Alternately hibernate validator provides org.hibernate.validator.Email if you're willing to depend on a vendor extension.

查看更多
smile是对你的礼貌
3楼-- · 2020-05-25 08:36

First try simpler regex such as this:

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

Than you can try RFC 2822 version:

"(?:[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])+)\\])"

Let me know if the either worked for you.

Also take look at this package

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

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

It might be better alternative.

查看更多
叛逆
4楼-- · 2020-05-25 08:47

You can use @Email from Hibernate Validator:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.4.1.Final</version>
    </dependency>
查看更多
叼着烟拽天下
5楼-- · 2020-05-25 08:49

If you use Hibernate Validator you can use @Email annotation Anyway you can create your custom contraint annotation and set a custom message to show in your resource properties file.

查看更多
登录 后发表回答