SpringMVC在返回JSON資料時出現406錯誤解決方案
阿新 • • 發佈:2018-12-15
在SpringMVC框架的使用中常常會使用@ResponseBody註解,修飾“處理器”(Controller的方法),這樣在處理器在返回完畢後,就不走邏輯檢視,而是將返回的物件轉成JSON字串響應給客戶端,但這種操作有時會出現406錯誤。
引入問題
我們通過瀏覽器訪問一個處理器,該處理器返回一個JSON字串,但是我們訪問後報406錯誤。
處理器程式碼
@RequestMapping("/cart/update/num/{itemId}/{itemNum}") @ResponseBody public User updateItemNum(@PathVariable("itemId") Long itemId, @PathVariable("itemNum") Integer itemNum, HttpServletRequest request, HttpServletResponse response) { return new User("張三",10); }
出現406問題的可能原因:
原因一:
該專案並沒有匯入jackson的相關jar包
Maven工程的依賴:
<!-- Jackson Json處理工具包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
原因二:
請求字尾為.html,瀏覽器預設將相應體的內容當做html資源,但實際上相應的並不是Html資源,而是一個JSON。此時就會報406錯誤。
解決方案一:
第一步: 為前端控制器的攔截方式新增一種新的形式。
第二步:在需要返回JSON資料的請求時使用.action結尾的URL進行訪問
解決方案二:
如果由於某種原因不能更改前端控制器的攔截方式,那麼我們可以在處理器中將需要返回的物件,手動通過第三方JSON轉換工具轉換成字串(這裡使用fastjson),然後直接返回字串。此時我們通過.html結尾的URL訪問處理器就不會報406錯誤了
處理器程式碼:
@RequestMapping("/cart/update/num/{itemId}/{itemNum}")
@ResponseBody
public String updateItemNum(@PathVariable("itemId") Long itemId, @PathVariable("itemNum") Integer itemNum,
HttpServletRequest request, HttpServletResponse response) {
return JSON.toJSONString(new User("張三",10));
}
請求的結果:
此種方法之所以可以解決問題,是因為我們直接返回字串,Http相應的ContentType就變成了html/text格式了,而在我們返回一個物件時,SpringMVC框架將物件轉換成JSON物件時,Http相應的ContentType型別為application/json。