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

Spring Validator validate方法未触发:UserValidator校验失效问题

问题:UserValidator的validate方法未被触发,InitBinder已执行

我有两个功能相近的控制器:产品控制器(ProductController)和用户控制器(UserController),计划为两者添加Spring Validation校验。已实现ProductValidator和UserValidator两个Validator接口实现类,其中ProductValidator工作正常,但UserValidator的validate方法始终未被调用。经排查,InitBinder方法已执行,但校验逻辑未生效,而ProductController的相关校验完全正常。

核心原因分析

问题出在WebDataBinder.setValidator()方法的使用上:

  • 当User实体类添加了JSR303校验注解(如@NotEmpty、@NotNull)时,Spring默认会使用LocalValidatorFactoryBean处理这些注解的校验。
  • 调用setValidator(userValidator)会替换掉默认的校验器,若JSR303注解校验先触发并产生错误,自定义校验器的逻辑可能不会被执行;或是默认校验器被替换后,自定义校验器的触发逻辑出现冲突。

解决方案

将setValidator()替换为addValidators(),既保留默认的JSR303校验器,又将自定义的UserValidator加入校验链,两者都会被执行:

修改UserController的InitBinder方法

@InitBinder("user")
private void initBinder(WebDataBinder binder) {
    // 替换setValidator为addValidators,添加自定义校验器而非替换默认校验器
    binder.addValidators(userValidator);
    binder.registerCustomEditor(Role.class, "roles", new RoleEditor(roleService));
}

额外验证点

  1. 确认参数顺序:确保BindingResult紧跟在@Valid注解的参数之后,你的代码中已满足要求:
    public ModelAndView submit(@ModelAttribute("user") @Valid User user, BindingResult result)
    
  2. 校验supports方法:UserValidator的supports方法逻辑正确,能匹配User类:
    @Override
    public boolean supports(Class<?> paramClass) {
        return User.class.equals(paramClass);
    }
    
  3. 注入正确性:UserValidator通过@Component("userValidator")声明,控制器中通过@Autowired @Qualifier("userValidator")注入,且InitBinder已执行,说明注入无问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:15:41