@RequestBody應用,requestbody

來源:互聯網
上載者:User

@RequestBody應用,requestbody

之前寫過一篇記錄文章,寫的是將一個比較複雜的資料結構在前台組合起來後傳遞到後台。

當時並不太瞭解@RequestBody,也並沒有使用js提供的JSON.stringify()方法

所有都是自己寫的,比如js將json轉為字串的方法,後台接收json轉成實體的方法。


最近接觸到了@RequestBody,於是想將之前的代碼改寫一下。

首先@RequestBody需要接的參數是一個string化的json,這裡直接使用JSON.stringify(json)這個方法來轉化

其次@RequestBody,從名稱上來看也就是說要讀取的資料在請求體裡,所以要發post請求

第三,要設定contentType,contentType:"application/json,明確的告訴伺服器發送的內容是json,而預設的contentType是application/x-www-form-urlencoded; charset=UTF-8

那麼可以開始寫出代碼了:

$.ajax({type: "post",contentType:"application/json",url: "repairs/saveDispatches",data: JSON.stringify(dispatchesDTO),success: function(data){    if(!data.success){          alertError("派工失敗");    }else{    alertSuccess("派工成功");}})

後台怎麼接呢?這就輪到@RequestBody出馬了

@RequestMapping("/repairs/saveDispatches")public void saveDispatches(@RequestBody DispatchesDTO dispatchesDTO,HttpServletResponse response) throws IOException {dispatchesService.saveDispatches(dispatchesDTO);success(response);}

很簡單吧,無需手動進行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下

<!--Spring3.1開始的註解 HandlerAdapter --><beanclass="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><property name="messageConverters"><list><beanclass="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean></list></property></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包


怎使用springmvc的@requestbody 返回json資料

先配置 XXX_ servletxml
<!-- 整合jackson 返回一個json格式 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter"/>
</list>
</property>
</bean>
<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>

再然後Action方法裡註解就可以
@RequestMapping(value="/XXXXXX", method = RequestMethod.POST)
@ResponseBody
public 傳回型別 XXXXXX(){

}
 
@responsebody一般在什情況下使用,他的好處與壞處?

@responsebody表示該方法的返回結果直接寫入HTTP response body中
一般在非同步擷取資料時使用,在使用@RequestMapping後,傳回值通常解析為跳轉路徑,加上@responsebody後返回結果不會被解析為跳轉路徑,而是直接寫入HTTP response body中。比如非同步擷取json資料,加上@responsebody後,會直接返回json資料。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.