处理方法存在BindingResult参数时@ExceptionHandler方法不生效问题
现象原因
这是Spring MVC参数校验的默认处理规则直接决定的:
- 当
@Valid注解修饰的请求参数后紧跟着声明BindingResult类型参数时,Spring框架会把校验产生的所有错误结果自动注入到这个BindingResult实例中,不会抛出MethodArgumentNotValidException异常。全局异常处理器自然捕获不到对应异常,所以打印逻辑不会执行。这种场景下需要你主动在Controller方法中调用bindingResult.hasErrors()判断是否存在校验错误,自行处理错误逻辑。 - 当你移除
BindingResult参数后,校验失败时Spring没有可以存储错误结果的载体,会直接抛出MethodArgumentNotValidException异常,被你定义的全局异常处理器捕获后,就会执行对应的打印逻辑。
保留BindingResult的正确写法示例
如果需要在Controller层自行处理校验错误,可以参考如下代码:
@PostMapping("userdata") public void validdata(@Valid @RequestBody User user, BindingResult bindingResult) { // 主动判断是否存在校验错误 if (bindingResult.hasErrors()) { System.out.println("Invalid Input!"); // 也可以收集具体错误信息返回给前端 return; } // 校验通过后执行正常业务逻辑 }
内容的提问来源于stack exchange,提问作者Kaustubh Dixit
相关产品推荐
相关产品推荐

