一尘不染

休眠验证器:@Email接受ask @ codingdic为有效吗?

spring-mvc

我正在使用@Email注释来验证电子邮件地址。我遇到的问题是它正在接受诸如`ask@stcodingdic有效的电子邮件地址之类的东西。我猜这是因为他们想支持Intranet地址,但是我似乎找不到标志,因此它会检查扩展名。

我是否真的需要切换到@Pattern(以及有关灵活的电子邮件模式的任何建议)还是缺少什​​么?


阅读 367

收藏
2020-06-01

共1个答案

一尘不染

实际上,@Email从Hibernate Validator
内部使用regexp。您可以根据该正则表达式轻松定义自己的约束,并根据需要进行修改(请注意+的结尾DOMAIN):

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {})
@Pattern(regexp = Constants.PATTERN, flags = Pattern.Flag.CASE_INSENSITIVE)
public @interface EmailWithTld {
    String message() default "Wrong email";
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default { };
}

interface Constants {
    static final String ATOM = "[a-z0-9!#$%&'*+/=?^_`{|}~-]";
    static final String DOMAIN = "(" + ATOM + "+(\\." + ATOM + "+)+";
    static final String IP_DOMAIN = "\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\]";

    static final String PATTERN =
            "^" + ATOM + "+(\\." + ATOM + "+)*@"
                    + DOMAIN
                    + "|"
                    + IP_DOMAIN
                    + ")$";
}
2020-06-01