基于Twilio的OTP登录Spring验证失效求助:空手机号无提示
Spring校验未生效问题修复方案
你的问题核心是校验逻辑的绑定对象错了,导致Spring没触发实体类的校验规则:
你把校验注解(@NotBlank、@Size)加在了PhoneNo实体类的mobileNumber字段上,但接口里却给@RequestParam的mobileNumber加了@Valid,而且BindingResult是绑定到@ModelAttribute的PhoneNo对象上的——这相当于你告诉Spring要校验单独的字符串参数,但这个参数本身没有加校验注解,而实体类的校验规则根本没被触发。
修复步骤(推荐方案)
直接调整接口参数,让Spring校验PhoneNo实体类对象:
- 把
@Valid注解移到@ModelAttribute的PhoneNo参数上 - 接口逻辑里使用实体类中的
mobileNumber值 - 确保前端表单的手机号输入框
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
相关产品推荐
相关产品推荐

