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 条评论
登录 后参与评论

相关文章

来自专栏IT可乐

Spring详解(六)------AspectJ 实现AOP

  上一篇博客我们引出了 AOP 的概念,以及 AOP 的具体实现方式。但是为什么要这样实现?以及提出的切入点表达式到底该怎么理解?   这篇博客我们通过对 A...

1866
来自专栏青枫的专栏

day39_Spring学习笔记_07_CRM_03

  /day36_06_Spring_crm/WebRoot/WEB-INF/pages/coursetype/listCourse.jsp

692
来自专栏余林丰

MyBatis之级联——鉴别器

鉴别器(discriminator)是MyBatis为我们提供的第三个级联也是最后一个。基于之前两篇级联中的场景,现增加学生们去体检,但男女体检项目不一样,我们...

2367
来自专栏编程软文

redis是如何存储对象和集合的

1957
来自专栏不想当开发的产品不是好测试

spring boot 登录注册 demo (二) -- 数据库访问

通过data-jpa来访问数据库      <dependency> <groupId>org.springframework.boot...

1876
来自专栏Java编程技术

你真的的懂JDBC?

Java中操作数据库元老是使用JDBC,而JDBC内部是如何实现的,为何每次使用时候都是写那些不理解的几行固定代码?这些看似不相关的代码内部是否有瓜葛那,下面进...

582
来自专栏精讲JAVA

Java 8 和 Java 9 中并发工具的改变

Java 8 和 Java 9中 concurrent 包有了一些改变, 本文对这些改变做了汇总。

1132
来自专栏不想当开发的产品不是好测试

java 执行sql文件

# 背景 用例执行完毕,期望回滚数据,因此希望执行sql来回滚数据 # 步骤 直接show代码,借助的是mybatis的ScriptRunner /** ...

3228
来自专栏我杨某人的青春满是悔恨

走进 RxSwift 之观察者模式

RxSwift 是 ReactiveX 系列的 Swift 版本,如果你之前用过 ReactiveCocoa(RAC) 的话,想必对 Functional Re...

1032
来自专栏编程坑太多

JQuery碎碎念

1163

扫码关注云+社区