sPRing3.0升級到4.2之后,遇到了一些很搞的問題,困擾了我很長時間,網上也搜索了很久,沒有解決我的問題。不過現在問題解決了,決定分享一下,方便那些遇到跟我一樣問題的朋友。
不過也產生了一些新的問題,很希望哪位朋友能給我一些提示。
首先第一個問題就是很經典的404,明明我后臺已經進去了,代碼也執行完了,并且沒有出現任何問題,也正常返回,可是為何Ajax代碼一直進error,不進success? 于是打印錯誤信息: xmlHttpRequest.status:404 xmlhttpRequest.readyState:4 textStatus:error XMLHttpRequest.readyState=4,表示響應內容解析完成,可以在客戶端調用了,這我就更郁悶了,既然不是后臺的問題,那么是jquery有問題?。so又在瀏覽器直接輸入url看看能不能返回json串,于是solo了一把,結果把我驚艷了: 第一:我返回的是json,它為何是個jsp?第二:我沒有這個jsp!第三:這個jsp的名稱看起來是我的函數名?好了事已至此看來還是后臺的問題,于是問題又回到了后臺上,看起來后臺沒有返回json而是jsp,jsp名稱默認為我的函數名,而我又沒有這個jsp,所以導致404,那么著重點就放在了為何會出現這種情況。
后來經過堅持不懈的調試以及對比,發現是map的問題,于是修改代碼,自己實例化一個map,問題得以解決。具體代碼如下: 修改前: 修改后:
后來經過兩個map的對比,發現函數中作為參數傳進來的map,比自己實例化的map多兩個屬性,有圖有真相:
就這么稍微改了下,404頭也不回的就走了。由此產生了幾個新的問題,第一:是這多出來的兩個屬性中的哪一個導致的404,第二:為什么會返回html而不是json,這兩個問題我還沒有搞清楚,非常希望哪位大神來幫忙解答一下
你以為這樣就結束了?當然沒有,406不期而至,由于404已經差不多耗干了我的腦細胞,所以406一記重拳差點把我打哭,可是木有辦法,咬牙接著百度。
406:表示服務器生成的響應無法被客戶端所接受,現在說明結果是能正確的返回到正確的頁面了,可是又出現這種問題?之前明明是好的啊~~~~!why?tell me why?
百度了好久,總算是發現了一些有用的線索,spring3.1及以后的版本,requestedMediaTypes由[*/*]
變成了[text/html],而producibleMediaTypes都是[application/json],可參考http://blog.csdn.net/gbtyy/article/details/17165605
由此可見spring3.1之后的版本,默認的編碼方式變成了[text/html],而工程后綴如果為.html,則會采用這種默認的編碼方式,此時采用@ResponseBody注解進行json自動轉換當然會出現406。并且很不巧的是本人的工程后綴又恰好是.html,簡直是可喜可賀!
so,知道原因后解決起來當然簡單多了。本人親身試驗的幾個解決辦法: 第一:在不改變原有的spring-mvc配置文件的情況下,改變你的工程后綴!讓.html見鬼去吧。
第二:依然采用.html為后綴,不過要修改<mvc:annotation-driven/>
配置,改成:
至此問題全部解決!
新聞熱點
疑難解答