SpringBoot中@Email校验异常:输入perisava.util.Random@1d7f0036未触发校验
解决@Email注解未拦截非标准邮箱格式的问题
看起来你遇到的问题是自定义的@Email正则表达式没有正确拦截像perisava.util.Random@1d7f0036这类不符合常规邮箱格式的字符串,而空值校验却正常生效。我来帮你分析原因和解决方案:
问题根源
你的@Email注解里的regexp属性存在语法错误:开头多了一个多余的{字符。正则表达式中的{是量词符号(比如{3}表示匹配3次),未转义的{会导致整个正则语法失效。当Jakarta Validation遇到无效的正则表达式时,会默认跳过该校验规则,只执行@NotEmpty的校验——这就是为什么空值被拦截,但非空的无效邮箱却通过了校验。
另外,即使修正了语法错误,如果你希望拦截无点域名的字符串,也要确保正则的域名部分要求至少包含一个.(比如@example.com而非@1d7f0036)。
解决方案
方案1:使用@Email的默认校验(推荐)
Jakarta Validation的@Email注解自带了经过验证的标准邮箱正则,不需要自定义regexp就能满足绝大多数场景。直接去掉regexp属性即可:
@Email(message = "Email is not valid") @NotEmpty(message = "Email cannot be empty") private String email;
这个默认规则会自动拦截perisava.util.Random@1d7f0036这类无点域名的字符串,因为它不符合RFC标准的邮箱格式。
方案2:修正自定义正则表达式
如果你确实需要自定义校验规则,先修正语法错误(去掉开头的{),然后确保域名部分的规则要求至少包含一个点。例如修正后的正则:
@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;
修正后的正则会要求@后面的部分要么是带点的域名(比如domain.com),要么是方括号包裹的IP地址,从而拦截@1d7f0036这类无效格式。
验证建议
修改后可以用以下测试用例验证:
- 空值:应该触发@NotEmpty的提示
- 有效邮箱(如
test@example.com):校验通过 - 无效邮箱(如
perisava.util.Random@1d7f0036):触发@Email的错误提示
内容的提问来源于stack exchange,提问作者en Peris
相关产品推荐
相关产品推荐

