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

@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 23:47:45