Spring Boot 中的 javax.validation.constraints.Email
Posted
技术标签:
【中文标题】Spring Boot 中的 javax.validation.constraints.Email【英文标题】:javax.validation.constraints.Email in SpringBoot 【发布时间】:2021-03-29 22:11:31 【问题描述】:我有一个经过此验证的 bean:
@Email(message = "Email is not valid", regexp="(?:[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])+)\\])")
@NotEmpty(message = "Email cannot be empty")
private String email;
当电子邮件为空时,消息很好,但是当我输入此文本时
perisava.util.Random@1d7f0036
没有显示错误
【问题讨论】:
你能确认你收到ConstraintViolationException
吗?
不,我什么也没得到 :-(
【参考方案1】:
javax.validation.constraints.Email
注解依赖Jakarta Bean Validation providers
进行验证。 Hibernate Validator 是唯一兼容的验证器。
默认情况下,hibernate vaildator 将电子邮件与正则表达式 .*
匹配,除非您自己提供正则表达式。 Hibernate 电子邮件验证器源代码是here。
一种解决方案是提供您自己的电子邮件正则表达式
@Email(message = "Email is not valid", regexp = "(?:[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])+)\\])")
@NotEmpty(message = "Email cannot be empty")
private String email;
您可以找到正则表达式here。 java的正则表达式是
(?:[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])+)\])
【讨论】:
我试过这个错误:java.util.regex.PatternSyntaxException: Illegal repeat (?:[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])+)]) 在 java.base/ java.util.regex.Pattern.error(Pattern.java:2010)
我已经尝试了解决方案,它对我有用:(。我正在添加我的解决方案。我正在使用 java 8 和 spring boot 2.3.4【参考方案2】:
通过查看源代码解决了这个问题。 @Email注解有一个属性regexp(),默认是'.*'。并且匹配你输入的字符,你可以自己写正则表达式
【讨论】:
以上是关于Spring Boot 中的 javax.validation.constraints.Email的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot2 系列教程(十三)Spring Boot 中的全局异常处理
Spring Boot2 系列教程Spring Boot 中的静态资源配置
使用 Spring Boot Maven 插件时,jar 文件中缺少 Spring Boot 应用程序中的资源