zoukankan      html  css  js  c++  java
  • 解决 spring mvc3.1下post json出现HTTP Status 400 The request sent by the client was syntactically incorrect

    问题描述:

    已声明

    @RequestMapping(value="update", method = RequestMethod.POST) 
        @ResponseBody 
        public Map<String, Result> updateNavi(@RequestBody Navigation model)

    启动日志有:

    Mapped "{[/navi/update],methods=[POST],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.util.Map<java.lang.String, com.apusic.ebiz.framework.web.controller.Result> com.mm.NavigationController.updateNavi(com.mm.navigation.Navigation)

    执行

    $.postJSON('http://localhost:8082/mm/navi/update',{a:1})

    报400错误.

    $.postJSON('http://localhost:8082/mm/navi/update',{})

    没有错.

    他大爷的,之前一直使用这个方法,提交表单完全正常。见鬼了。


    排错

    1.控制台无任何信息,认为请求根本没有进系统,以被tomcat档住了,怀疑是web.xml,spring-mvc.xml等配置问题

    但修改web.xml,spring-mvc的N多参数无果。但想想,之前都可以成功,为啥突然不成功呢,奇怪了。

    2.怀疑构造的post的data不是json格式的,专门从一个能成功提交的json格式对比一下,完全一样。这下傻眼了、

    3.为什么空JSON构造能成功呢?请求直接到了Controller,不知道

    4.当我尝试使用

    $.postJSON('http://localhost:8082/mm/navi/update',””)

    它居然报错了,原来,他进了系统,返回错误给TOMCAT,所以tomcat才报错的400

    果断在org.springframework.web.servlet.DispatcherServlet.doDispatch(HttpServletRequest, HttpServletResponse)打断点

    果然,进来了,一步步跟,发现下面有log.debug,原来有日志的,而我的控制台没日志,郁闷,一看log4j,果然是info级别的


    解决:

    打开log4j对org.springframework.web=debug

    再次请求

    $.postJSON('http://localhost:8082/mm/navi/update',{a:1})

    终于见到异常了

    Resolving exception from handler org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unrecognized field "a" (Class com.mm.navigation.Navigation), not marked as ignorable 
    at [Source: org.apache.catalina.connector.CoyoteInputStream@8f74ba; line: 1, column: 7] (through reference chain: com.apusic.mm.navigation.Navigation["a"]); nested exception is org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "a" (Class com.mm.navigation.Navigation), not marked as ignorable 
    at [Source: org.apache.catalina.connector.CoyoteInputStream@8f74ba; line: 1, column: 7] (through reference chain: com.apusic.mm.navigation.Navigation["a"])

    之前异常都被 spring吃了,烦啊。

    原来是实体Navigation里没有a的属性,转换不成功,抛出异常,却被spring转成400错误,简单丢出来了,spring厚道啊。

    再次请求有的参数,

    $.postJSON('http://localhost:8082/mm/navi/update',{id:1})

    果然好了。

    仅写此,共享之,启发一下,问题虽然简单,但有时候脑子容易短路,找不到点。

    附:

    $.postJSON = function(url, data, callback) { 
        return jQuery.ajax({ 
            'type': 'POST', 
            'url': url, 
            'contentType': 'application/json', 
            'data': JSON.stringify(data), 
            'dataType': 'json', 
            'success': callback 
        }); 
    };

  • 相关阅读:
    线程系列2---线程同步
    off() 方法 与 unbind() 方法移除绑定事件的处理程序。one()函数用于为每个匹配元素的一个或多个事件绑定一次性事件处理函数
    animation css3动画与CSS3 @keyframes担配使用创建往复平缓动画
    querySelector 和 querySelectorAll 的使用
    js实现浏览器兼容复制功能
    evaluateScript--evaluatePopoverScript--区别
    appcan 跨窗口处理方法 appcan.window.evaluateScript({name,scriptContent,type})使用解读
    条件注释判断浏览器<!--[if !IE]><!--[if IE]><!--[if lt IE 6]><!--[if gte IE 6]>
    stop() 是用于停止动画 :animated 用于判断动画是否在进行中
    CSS3的calc()使用
  • 原文地址:https://www.cnblogs.com/stevenx1987/p/4208688.html
Copyright © 2011-2022 走看看