spring mvc底層通過訊息轉換器 解析json字串/json物件成JavaBean
阿新 • • 發佈:2019-02-01
講述一個自己寫Controller層的介面的經歷,到現在一共經歷了三種改變:
* 介面引數是基本
型別;
* 介面引數是JOSNObject
型別;
* 介面引數是JavaBean
型別;
每次改變都對spring有了更深入的瞭解,每次改變都讓程式碼變得更加簡化、更加易讀。
階段一(介面引數是String
型別)
在初學spring-web的時候,Controller層的介面形參都是基本型別,比如:
@RequestMapping(value = "/interface01", method = RequestMethod.GET)
public String testInterface01 (@RequestParam String username, @RequestParam int age, @RequestParam float heigh) { return ... }
@RequestMapping(value = "/interface02", method = RequestMethod.POST)
public String testInterface02(@RequestBody String params) { return ... }
無論是GET方法,還是POST方法,無論請求引數是基本型別資料,還是json字串或JOSNObject,介面形參都是基本資料型別。然後根據需要從基本型別資料中轉換或解析。超級麻煩。
階段二(介面引數是JOSNObject
型別)
後來慢慢的瞭解到http介面傳參常用json來傳輸資料,後來介面就改成了如下方式:
@RequestMapping(value = "/interface03", method = RequestMethod.GET)
public String testInterface03(@RequestParam JSONObject jsonObject) { return ... }
@RequestMapping(value = "/interface04", method = RequestMethod.POST)
public String testInterface04 (@RequestBody JSONObject jsonObject) { return ... }
當引數不是單個的基本型別資料時,無論是GET還是POST,形參接收請求引數時,都用上JSONObject來接收了。然後直接通過JSONObject來做進一步的轉化和處理。比第一階段方便了寫。
階段三(介面引數是JavaBean
型別)
但是隨著介面越來越多,發現這種無謂的轉換是沒有價值的。每一個介面的輸入都先進行轉換,閒的介面非常的臃腫。那麼介面引數能不能直接使用儲存資料的JavaBean呢?很幸運,Spring是支援的。
@RequestMapping(value = "/interface05", method = RequestMethod.GET)
public String testInterface05(@RequestParam JavaBean javaBean) { return ... }
@RequestMapping(value = "/interface06", method = RequestMethod.POST)
public String testInterface06(@RequestBody JavaBean javaBean) { return ... }
這樣的話,我們在介面處可以直接進行JavaBean的操作了,是不是方便了很多?
但是要注意的是,先要讓Spring自己實現從請求引數json到JavaBean的轉換,需要通過Spring的訊息轉換器
進行訊息轉換,我們需要對Spring進行如下配置:
###我在這裡使用的是fastJson的訊息轉換器
<bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<!-- 加入支援的媒體型別,返回contentType -->
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>