zoukankan      html  css  js  c++  java
  • 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);
    }
    
  • 相关阅读:
    谷歌地图嵌入配置及代码生成器
    Easyui几种布局方式的使用
    9款超酷的jQuery/CSS3插件
    8款功能强大的最新HTML5特效实例
    《大话操作系统——做坚实的project实践派》(2)
    1、libgdx简单介绍
    自己定义Android Dialog
    纪念2014 TI DSP大奖赛
    LeetCode 96:Unique Binary Search Trees
    Chromium网页输入事件捕捉和手势检測过程分析
  • 原文地址:https://www.cnblogs.com/woshimrf/p/6602690.html
Copyright © 2011-2022 走看看