@Pattern注解在空输入时不生效,请求排查原因及正则问题
问题原因与解决方案
1. 核心问题分析
你的问题分为两部分:
- 正则表达式的逻辑疏漏:你写的
(^$|[0-9]{10})明确允许空字符串(^$匹配空内容),所以当传入空值时,正则校验是符合规则的,自然不会触发错误提示。 - Spring校验的机制补充:
@Pattern注解仅在参数不为null时执行校验,空字符串("")属于非null值,所以会执行校验,但因为你的正则允许空,所以校验通过,请求直接进入方法。
2. 针对性解决方案
根据你的业务需求,分两种情况处理:
情况A:手机号必须为10位数字,不允许空值/空白
- 移除正则中的
^$部分,仅保留[0-9]{10},确保只有10位数字能通过校验。 - 添加
@NotBlank注解,拦截空字符串、空白字符和null值。
修改后的代码:
@GetMapping("/fetch") void fetchData( @RequestParam @NotBlank(message = "Mobile number cannot be empty or blank") @Pattern(regexp = "[0-9]{10}", message = "Mobile number must be 10 digits") String mobileNumber ) { // 业务逻辑代码 }
此时的校验效果:
- 传入
mobileNumber=(空字符串):触发@NotBlank的错误提示。 - 传入9位数字:触发
@Pattern的错误提示。 - 传入10位数字:校验通过,进入方法逻辑。
情况B:允许空值,但空值或10位数字都需通过校验
如果业务确实允许空字符串,那当前的正则是正确的,但你需要确保Controller类上添加了@Validated注解——这是Spring开启方法参数校验的必要条件。如果没有添加,部分校验逻辑可能无法正常触发。
补充后的Controller类示例:
@RestController @Validated // 必须添加此注解开启参数校验 public class YourController { @GetMapping("/fetch") void fetchData( @RequestParam @Pattern(regexp = "(^$|[0-9]{10})", message = "Mobile number must be 10 digits or empty") String mobileNumber ) { // 业务逻辑代码 } }
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

