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);
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏后端之路

数据校验之Spring和Hibernate validate

目前系统中使用校验的地方比较多,前端校验&后端校验是绕不开的两个话题。 通常来说对于开发来说:后端校验是必备,前端校验是可选 1.前端验证可以没有,但后端验证必...

2315
来自专栏一个会写诗的程序员的博客

13.6 SpringBoot集成Mongodb开发问题@EnableMongoRepositories路径配置13.6 SpringBoot集成Mongodb开发问题@EnableMongoRepo

Parameter 0 of constructor in com.restfeel.controller.BlogController required a ...

852
来自专栏XAI

SpringMVC+Hibernate +MySql+ EasyUI实现CRUD(一)

最新项目下载地址 访问地址 ? 1.基于easyui的 增 删 改 查 2.基于poi的导出excel 3.基于 SpringMVC HandlerInte...

38811
来自专栏编程坑太多

JAVA实现Excel导入导出

1553
来自专栏颇忒脱的技术博客

Spring、Spring Boot和TestNG测试指南 - @ActiveProfiles

@ActiveProfiles可以用来在测试的时候启用某些Profile的Bean。本章节的测试代码使用了下面的这个配置:

1904
来自专栏智能计算时代

Capturing Packets in Linux at a Speed of Millions of PPS

My article will tell you how to accept 10 million packets per second without usi...

4047
来自专栏码匠的流水账

聊聊springboot session timeout参数设置

本文主要介绍下spring boot中对session timeout参数值的设置过程。

8602
来自专栏静默虚空的博客

[Spring]IoC容器之进击的注解

概述 Spring2.5 引入了注解。 于是,一个问题产生了:使用注解方式注入 JavaBean 是不是一定完爆 xml方式? 未必。正所谓,仁者见仁智者见...

1997
来自专栏微信公众号:Java团长

SpringBoot发送邮件

712
来自专栏Ryan Miao

spring注解

1.注解 @Controller控制器定义     和Struts1一样,Spring的Controller是Singleton的。这就意味着会被多个请求...

28110

扫码关注云+社区