Ajax前台返回JSON數據后再Controller中直接轉換成類型使用,后台接收json轉成實體的方法


之前寫過一篇記錄文章,寫的是將一個比較復雜的數據結構在前台組合起來后傳遞到后台。

當時並不太了解@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 -->
	<bean
		class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
		<property name="messageConverters">
			<list>
				<bean
					class="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數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM