1. 程式人生 > >SpringMVC在返回JSON資料時出現406錯誤解決方案

SpringMVC在返回JSON資料時出現406錯誤解決方案

       在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。