問題如標題所述,ajax向SpringMVC Controller傳遞JSON數據,遇到了錯誤“Failed to load resource: the server responded with a status of 400 (Bad Request)”,該錯誤爲前端報錯,JSON數據壓根沒有被Controller接收。因爲後端想通過接收JSON數據直接轉換爲pojo對象,進行pojo綁定。
經過一晚上的調試,最後定位問題於後臺Controller無法轉換接收到的JSON數據。進一步尋找解決方案,定位到了問題原因:pojo類中存在Date類型成員變量,轉換器無法將Date類型成員變量正確轉換。通過使用沒有Data類型數據成員的pojo類進行測試,發現確實是問題的真正原因。
1. 解決方案
實體類中加日期格式化註解
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date algorithmTime;
進一步,在相對應的pojo類中增添默認構造函數,沒有這一步可能無法解決問題,所以該步驟極爲重要。可能是由於在轉換器轉換過程中要調用默認構造函數來構造pojo對象。
public class Algorithm {
//默認構造函數
public Algorithm(){
}
}
2. SpringMVC接收ajax的JSON數據,後端綁定pojo對象
前端ajax:
var alg={
algorithmName:algName,
algorithmDescribe:algDesc,
classId:classId,
className:className
};
$.ajax({
type:'POST',
url:'algorithm/add',
data:JSON.stringify(alg),
dataType:'json',
contentType:'application/json; charset=utf-8',
async:true,
success:function(data){
console.log(data['algInfo']);
}
});
Controller處理:
@RequestMapping(value = "/algorithm/add",method = RequestMethod.POST,consumes = "application/json")
@ResponseBody
public String addAlgorithm(@RequestBody Algorithm algorithm){
/**
* 處理步驟
**/
Map<String,String> map=new HashMap<String, String>();
map.put("algInfo",algorithm.toString());
return map;
}
該問題還有許多解決的辦法,但是這個方法是最簡單的。在解決這個問題的過程中,《SpringMVC中出現”400 Bad Request”錯誤(用@ResponseBody處理ajax傳過來的json數據轉成bean)的解決方法》和《SpringMVC日期類型轉換問題三大處理方法歸納》這兩篇博文和博文的評論給了我非常大的幫助,感謝作者,其他的解決方法也可以從這兩篇博文中找到。
參考: