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

相关文章

来自专栏一个爱瞎折腾的程序猿

mvc网站迁移.net core记录

ConfigureServices方法中配置即可,详情见院长文章 http://www.cnblogs.com/dudu/p/5879913.html

541
来自专栏技术博文

php 二维码生成类

<?php /** * BarcodeQR - Code QR Barcode Image Generator (PNG) * @package Barco...

3775
来自专栏Flutter&Dart

DartVM服务器开发(第十五天)--Jaguar_ORM一对一

HasBean绑定一个bean 下面我们来新建Avatar这个类,从意思上,该实体类为用户的头像

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

SpringBoot集成日志logback.groovy报错: Groovy classes are not available on the class path. ABORTING INITIAL

SpringBoot集成日志logback.groovy报错: Groovy classes are not available on the class pa...

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

13.7 SpringBoot集成日志系统logback的几个问题问题1: Logging system failed to initialize using configuration from

让人感到疑惑的是,SpringBoot居然没有对application.properties配置文件value末端作空格trim处理。

731
来自专栏张高兴的博客

张高兴的 Windows 10 IoT 开发笔记:BH1750FVI 光照度传感器

2826
来自专栏一“技”之长

iOS获取通讯录联系人信息 原

随着apple对用户隐私的越来越重视,IOS系统的权限设置也更加严格,在获取系统通讯录之前,我们必须获得用户的授权。权限申请代码示例如下:

463
来自专栏别先生

SpringMVC的初始

1:其实一开始对SSH和SSM并不是很熟悉的,对SSH可能熟悉些(Struts,Spring,Hibernate)这三个框架。但是由于框架的更新,和出现了更好的...

1849
来自专栏数据分析

使用Visual Studio 2010 一步一步创建Powershell Module 和 Cmdlet

之前写了一个C# 调用PowerShell方法, 那么怎么反过来操作呢,也就是怎么样用C#写一个powershell命令呢? 现在就用C#写一个超级简单的Mod...

3779
来自专栏技术博文

ip地址查询

<?php Class IPQuery{ private static $_requestURL = 'http://ip.taobao.com/ser...

25011

扫描关注云+社区