首先@RequestBody需要接的參數是一個string化的json,這里直接使用JSON.stringify(json)這個方法來轉化
其次@RequestBody,從名稱上來看也就是說要讀取的數據在請求體里,所以要發post請求
第三,要設置contentType,contentType:"application/json,明確的告訴服務器發送的內容是json,而默認的contentType是application/x-www-form-urlencoded; charset=UTF-8
那么可以開始寫出代碼了:
1 $.ajax({ 2 type: "post", 3 contentType:"application/json", 4 url: "repairs/saveDispatches", 5 data: JSON.stringify(dispatchesDTO), 6 success: function(data){ 7 if(!data.success){ 8 alertError("派工失敗"); 9 }else{ 10 alertSuccess("派工成功"); 11 } 12 })
后台怎么接呢?這就輪到@RequestBody出馬了
1 @RequestMapping("/repairs/saveDispatches") 2 public void saveDispatches(@RequestBody DispatchesDTO dispatchesDTO, 3 HttpServletResponse response) throws IOException { 4 5 dispatchesService.saveDispatches(dispatchesDTO); 6 success(response); 7 }
很簡單吧,無需手動進行json與實體的轉換,只要能映射上去(也就是字段名和json的key相對應,value可以匹配上數據類型),那么就可以直接轉換。
如何定義“能映射上去”呢?若是json中的key在實體中都能找到對應的field,那么就是“能映射上去”,也就是說:
前台傳入的json中的key在實體中必須要存在,不然就會報錯,比如下面這個前台傳入的json中多了一個key為id的鍵值對
org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unrecognized field "id" (Class com.westsoft.kft.repairs.dto.DispatchesDTO), not marked as ignorable
其實要使用@RequestBody這個注解還需要額外配置一個Bean,也就是自動幫我們接收json並轉成對象的消息轉換器messageConverter
由於我使用的是Spring3.1之后的版本,那么配置在RequestMappingHandlerAdapter下
1 <!--Spring3.1開始的注解 HandlerAdapter --> 2 <bean 3 class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 4 <property name="messageConverters"> 5 <list> 6 <bean 7 class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 8 </bean> 9 </list> 10 </property> 11 </bean>
當然也可以通過<mvc:annotation-driven />來簡單的配置,這里就不過多介紹了~
最后再要提到幾點
一、若1、前台發送請求時未指定contentType為json/application 2、spring中未配置messageConverter
那么會報錯誤415,也就是類型不支持
前者是因為Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported
而后者是因為Content type 'application/json;charset=UTF-8' not supported
二、由於Spring中使用的json轉換用到的是jackson,所以需要引入jackson包
