天天看點

記一次使用@responseBody注解的過程java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/util/DefaultIndenter

    記得剛學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接收不到傳過來的值。請求是這樣的

記一次使用@responseBody注解的過程java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/util/DefaultIndenter

參數形式類似GET請求,同時參數被編碼過,但是具體為什麼參數綁定不到person中去,還不太明白。

(2)把contentType那一行注釋掉,參數順利綁定到形參上。請求是這樣的

記一次使用@responseBody注解的過程java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/util/DefaultIndenter

(3)把data改為JSON.stringify({"name":"張三","sex":"男"}),參數無法綁定。請求是這樣的

記一次使用@responseBody注解的過程java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/util/DefaultIndenter

(4)在(3)的基礎上,把contentType注釋掉,參數無法綁定。請求如下

記一次使用@responseBody注解的過程java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/util/DefaultIndenter

總結:

要想在前台傳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

繼續閱讀