SpringMVC中@RequestBody引起的400异常处理,返回校验失败具体信息
问题
使用@RequestBody
接收一个json数据的时候,如果传入的参数不符合条件,就会直接返回400的error page. 但究竟是为什么会400并没有抛出来。这对大量参数字段的我们来说,排错很困难,所以应该返回出错的原因。
Resolve
This was raised as an issue with Spring SPR-7439 – JSON (jackson) @RequestBody marshalling throws awkward exception – which was fixed in Spring 3.1M2 by having Spring throw a org.springframework.http.converter.HttpMessageNotReadableException in the case of a missing or invalid message body.
以上来自stackoverflow.
具体就是当spring的@RequestBody
注解进行marshall操作的时候,如果jackson跑出异常,就会抛出一个叫做HttpMessageNotReadableException
的异常,那么我们只要捕获并返回这个异常就可以了。
具体做法
最简单是在controller里加一个错误处理的方案:
@ExceptionHandler({HttpMessageNotReadableException.class}) @ResponseStatus(HttpStatus.BAD_REQUEST) @ResponseBody public CodeMsg resolveException(HttpMessageNotReadableException errors) { return CodeMsg.error(errors.getMessage()); }
如果想要对所有的controller生效,那么需要一个注解@ControllerAdvice
:
@ControllerAdvice public class GeneralHandler { @ExceptionHandler public ModelAndView handleException (NoSuchRequestHandlingMethodException ex) { ModelAndView mav = new ModelAndView(); ... return mav; } }
所以,可以处理你想要的异常:
@ExceptionHandler @ResponseBody @ResponseStatus(HttpStatus.BAD_REQUEST) public RestError resolveBindingException ( MethodArgumentNotValidException methodArgumentNotValidException, Locale locale ) { BindingResult bindingResult = methodArgumentNotValidException.getBindingResult(); return getRestError(bindingResult, locale); }
原文地址:https://www.cnblogs.com/woshimrf/p/6602690.html
相关推荐
-
springmvc中使用MockMvc测试controller Java框架
2019-3-22
-
【spring springmvc】这里有你想要的SpringMVC的REST风格的四种请求方式 Java框架
2020-6-11
-
单元测试(一)——SpringBoot建立单元测试 Java框架
2020-6-1
-
swift 开发 ios 应用— 数据模型到tableView Java框架
2019-8-21
-
Spring framework源码 Constants学习 Java框架
2020-6-1
-
Node.js + MySQL 实现数据的增删改查 Java框架
2019-5-13
-
3分钟干货之Spring Boot注解 Java框架
2019-4-15
-
熔断器 Hystrix 源码解析 —— 命令执行(二)之执行隔离策略 Java框架
2020-6-1
-
Spring Boot 2.0 的快速入门(图文教程) Java框架
2019-9-16
-
Spring-Boot项目部署到单独tomcat运行 Java框架
2019-10-5