記得剛學springMVC那會兒,使用@responseBody這個注解總是達不到自己想要的效果,但是又找不到到底是為什麼,是以後面就盡量避免使用該注解。今天閑來無事就想再來試試該注解,雖然過程很讓我抓狂,但是最終還是成功了。
1、前台傳參,背景接受不到
(1)前台ajax:
$("#mvc_link").bind("click",function(){
var option = {};
option.url = "${pageContext.request.contextPath }/test/testHandler.do";
option.async = true;
option.type = "POST";
option.contentType = "application/json;charset=utf-8";
option.dataType = "json";
option.data = {"name":"張三","sex":"男"};
option.success = function(result){
console.log(result.name);
};
$.ajax(option);
});
背景controller
@RequestMapping(value="/testHandler",
produces = "application/json; charset=UTF-8")
@ResponseBody
public Person testHandler(Person person){
return person;
}
這樣寫,背景testHandler()中的形參person接收不到傳過來的值。請求是這樣的
參數形式類似GET請求,同時參數被編碼過,但是具體為什麼參數綁定不到person中去,還不太明白。
(2)把contentType那一行注釋掉,參數順利綁定到形參上。請求是這樣的
(3)把data改為JSON.stringify({"name":"張三","sex":"男"}),參數無法綁定。請求是這樣的
(4)在(3)的基礎上,把contentType注釋掉,參數無法綁定。請求如下
總結:
要想在前台傳json資料,那麼前台contentType應當為預設值,并且json要求是一個json對象,不能使一個json字元串。
2、使用@responseBody的問題。
(1)前台報406錯誤
這個問題歸結起來就是一點:導包問題:沒有導入jackson的jar包
(2)導包之後,控制台出現
java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/util/DefaultIndenter
這個主要是jackson版本問題。
我是用的spring版本是4.3.5,而jackson-core則是2.4,換成2.7之後就好了。
這個可以參考下面的這篇部落格,寫得非常好。
Caused by: java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/util/DefaultIndenter