項目內容用的是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