You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:01:59