解決 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.mm.web.controller.Result> com.mm.NavigationController.updateNavi(com.mm.navigation.Navigation)

執行

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

報400錯誤.

image

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM