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

基于Twilio的OTP登录Spring验证失效求助:空手机号无提示

Spring校验未生效问题修复方案

你的问题核心是校验逻辑的绑定对象错了,导致Spring没触发实体类的校验规则:
你把校验注解(@NotBlank、@Size)加在了PhoneNo实体类的mobileNumber字段上,但接口里却给@RequestParam的mobileNumber加了@Valid,而且BindingResult是绑定到@ModelAttribute的PhoneNo对象上的——这相当于你告诉Spring要校验单独的字符串参数,但这个参数本身没有加校验注解,而实体类的校验规则根本没被触发。

修复步骤(推荐方案)

直接调整接口参数,让Spring校验PhoneNo实体类对象:

  1. 把@Valid注解移到@ModelAttribute的PhoneNo参数上
  2. 接口逻辑里使用实体类中的mobileNumber值
  3. 确保前端表单的手机号输入框name属性是mobileNumber(和实体类字段名一致)

修改后的接口代码:

@PostMapping("/sendotp")
public String sendotp(@Valid @ModelAttribute("phoneNo") PhoneNo phoneNo,
        BindingResult bindingResult, Model model) {
    if (bindingResult.hasErrors()) {
        return "modalnumber";
    }
    // 用实体类里的手机号去生成OTP
    return otpService.generateOtp(phoneNo.getMobileNumber());
}

备选方案(如果坚持用@RequestParam)

如果不想用实体类接收参数,直接把校验注解加在@RequestParam的参数上:

@PostMapping("/sendotp")
public String sendotp(@NotBlank @Size(min = 2, max = 15) @RequestParam String mobileNumber,
        BindingResult bindingResult, Model model) {
    if (bindingResult.hasErrors()) {
        return "modalnumber";
    }
    model.addAttribute("phoneNo", new PhoneNo(mobileNumber));
    return otpService.generateOtp(mobileNumber);
}

这种方式虽然能生效,但校验规则分散在接口参数上,不如实体类统一管理方便,后续维护成本更高。

内容的提问来源于stack exchange,提问作者prashant parapelli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:53:19