問題描述:
已聲明
@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錯誤.
而
$.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
});
};

