1. 程式人生 > >spring mvc底層通過訊息轉換器 解析json字串/json物件成JavaBean

spring mvc底層通過訊息轉換器 解析json字串/json物件成JavaBean

講述一個自己寫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>