springmvc與fastjson的整合,注解@RequestBody的使用


  項目內容用的是jetty框架,傳輸數據格式是json格式,有一天我心血來潮,把項目又搭建了一次,完了,卡在了數據傳輸的格式上,明明原來框架直接用fastjson,但是我用就是不對,總是報fastjson這個類無法加載。當時把依賴配置全部拆開了,一點一點的加,終於找到原因了,但是當時不懂。上周日在家用springmvc框架,也想用fastjson傳輸數據,問題來了。不過解決了,在此總結一下,希望給跟我遇到同樣問題的人一個解答。

1、springmvc原來的注解@RequestBody 解析的請求數據是字符串類型,如果直接配置請求數據格式為com.alibaba.fastjson.JSONObject,那么會拋出下面的異常:

Controller [springMVCmybatis.modifyController]
Method [public java.lang.Object springMVCmybatis.modifyController.addEmpGetStu(com.alibaba.fastjson.JSONObject) throws java.lang.Exception]

這是因為@RequestBody解析請求的數據的時候會用StringHttpMessageConverter類,將http請求的body解析成String類型。如果想用JSON來接收數據,那么就要配置httpMessageConverter類,所以也可以自己定義解析的方式。下面就是在applicationContext.xml文件中的配置。

2、在applicationContext.xml文件中配置如下代碼,這樣就可以用FastJson來解析數據了。

<mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json</value> 
						<value>application/xml;charset=UTF-8</value>  
                    </list>
                </property>
                <property name="features">
                    <list>
                    <!-- 默認的意思就是不配置這個屬性,配置了就不是默認了 -->
                       <!-- 是否輸出值為null的字段 ,默認是false-->
			            
                        <value>WriteMapNullValue</value>
                        
                        <value>WriteNullNumberAsZero</value>
                        <value>WriteNullListAsEmpty</value>
                        <value>WriteNullStringAsEmpty</value>
                        <value>WriteNullBooleanAsFalse</value>
                        <value>WriteDateUseDateFormat</value>
                    
                    </list>
                </property>
            </bean>
               
     </mvc:message-converters>
</mvc:annotation-driven>
 

3、fastJson可以將傳輸過來的數據直接轉換成對象,這一點比較好,省去了中間轉換的麻煩,這里我就舉一個Student的例子。

postMan請求的數據json數據格式如下:

{
	"id" : null,
	"name": "張三",
	"clas":"2",
	"interest" : ""
	
}

服務器的代碼如下:

@RequestMapping(value = {"/modifyStu.do"},method={RequestMethod.POST}, 	consumes={"application/json"}, 
			produces={"application/json"})	
@ResponseBody
	public Object addEmpGetStu(@RequestBody Student student)throws Exception {
	
	JSONObject responseObj = (JSONObject)JSONObject.toJSON(student);
		
	return responseObj ;

postMan接收到的數據如下,可以看見id輸入的是null,但是返回的是0,就是因為配置中將整數輸入為null,轉換成0

{
    "clas": "2",
    "interest": "",
    "name": "張三",
    "id": 0
}

 

【參考博客】

1、https://my.oschina.net/yehun/blog/872218

2、http://blog.csdn.net/qq_21989939/article/details/46739567 

 

  


免責聲明!

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



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