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)); }
额外验证点
- 确认参数顺序:确保
BindingResult紧跟在@Valid注解的参数之后,你的代码中已满足要求:public ModelAndView submit(@ModelAttribute("user") @Valid User user, BindingResult result) - 校验supports方法:UserValidator的supports方法逻辑正确,能匹配User类:
@Override public boolean supports(Class<?> paramClass) { return User.class.equals(paramClass); } - 注入正确性:UserValidator通过
@Component("userValidator")声明,控制器中通过@Autowired @Qualifier("userValidator")注入,且InitBinder已执行,说明注入无问题。
内容的提问来源于stack exchange,提问作者YuraCoupe
相关产品推荐
相关产品推荐

