Spring4
HttpMessageConverter
Spring 客製化HttpMessageConverter
2017/12/29 15:11:42
0
1538
Spring 客製化HttpMessageConverter
簡介 |
簡單介紹Spring HttpMessageConverter 訊息轉換器, 並透過範例,提供客製化資料格式的請求與回應 |
作者 |
江直穎 |
1. 簡介
現在越來越多專案會導入SpringMVC搭建Restful環境架構需求,然而大部分的Restful 服務在資料請求與回應方式皆使用JSON or XML 等此類與前端溝通較為普遍且方便的資料格式。
然而 Spring提供了一個簡單的訊息轉換器:HttpMessageConverter ,它讓開發者在HTTP傳輸過程中來針對Java物件來編組(marshall)與解組(unmarshall) 來讓資料處理讓程式端的開發更加快速、方便。
Spring官方也提供許多預設類別,並提供如何實作客製化的方法,本文章透過以下範例,簡單地介紹客製化 HttpMessageConverter 使用方式。
2.
目的
- 初步了解Spring 客製化 HttpMessageConverter 實作使用方式
- 簡單建立Spring restful 服務示範實作結果
3.
開始前準備
本架構建立於以下版本的環境:
- JDK 8
- Spring 4.3.10
- IDE使用 Eclipse Mars.1 Release (4.5.1)
- 測試工具使用Firefox RESTClient
4.
程式範例
4.1、 首先建構一個SpringRestfulServer部分實作,本範例使用Eclipse建立專案:
建立Dynamic Web Project

4.2、 因為本範例需引用Spring相關Library,所以我們在這轉換成Maven專案

4.3、 定義pom.xml檔案,這邊需引用Spring webmvc 版本4.3.10相關Library

4.4、 關於HttpMessageConvert Interface 檔案,我們可以發現Spring 將其歸類於 web Library部分
檔案路徑位於
org.springframework.http.converter.
HttpMessageConverter.class
此介面提供了5個需要被實作的方法:
canRead:判斷該轉換器是否能將請求內容轉換成Java Object
canWrite:判斷該轉換器是否可以將Java Object轉換成返回內容
getSupportedMediaTypes:獲得該轉換器支援的MediaType
read:讀取請求內容並轉換成Java Object
write:將Java Object轉換後寫入返回內容
其中read和write方法的參數分別有HttpInputMessage和HttpOutputMessage對象,
這兩個對象分別代表著一次Http通訊中的request/response部分,可以通過getBody方法獲得對應的輸入和輸出串流

4.5、 客製化部分我們可以直接實作HttpMessageConvert 這個介面
或是建議可以繼承AbstractHttpMessageConverter.class 這個官方已經實作部分方法的抽象類別
如下圖,程式內有多一些基本的宣告(如log、mediaType、charset等屬性)並已經提供實作介面的方法

4.6、 本篇文章將示範假設一個Http的請求,其Content-Type為 "text/book"
資料的傳遞透過客製化HttpMessageConvert 將對服務的請求/回應資料流轉換成名為 Book 的物件
首先建立Book.java

4.7、 新增BookConverter.java 繼承並實作AbstractHttpMessageConverter
下圖可以發現,在建構BookConverter物件時,我們加入了一個MediaType:text/book
並且實作supports、readInternal、writeInternal 三個方法
其中
readInternal 方法將HttpInputMessage請求內容轉換成Book物件
writeInternal
方法將
HttpOutputMessage
回應內容轉換成Book物件

4.8、 新增BookInfoController.java 並定義兩個method處理input & output資料
其中 saveBook method 處理@RequestBody 為Book的物件,並暫存在List裡
而 findBookById method Book的物件透過@ResponseBody 回應並印出查詢該物件內資料內容

4.9、 本範例使用Spring 4.x 版本開發風格
透過Annotation方式配置相關設定,而不使用Spring 相關xml配置
新增一個繼承WebMvcConfigurerAdapter的檔案 AppConfig.java
override
extendMessageConverters方法
並將先前步驟客製化HttpMessageConverter
BookConverter 檔案,加入List中

4.10、 接著新增一個 透過繼承 AbstractAnnotationConfigDispatcherServletInitializer 的檔案 AppInitializer.java
配置Spring DispatcherServlet 達到如同web.xml的設定

4.11、 最後啟動tomcat server成功,Controller 內的RequestMapping 內容也建立完成

4.12、 使用Firefox plugin程式 RESTClient 測試看看吧:
透過POST方式向服務端送出請求,將表單資料暫存成Book物件放置於服務端
使用URL=> http://localhost:8080/SpringRestfulServer/saveBook 發送請求
其中需定義HttpHeader 的 Content-Type 為 "text/book"
因為有設定@ResponseBody的關係,所以這邊結果會 回傳Book 物件並印出資料內容

4.13、 透過GET方式向服務端請求查詢 BookId 為1的資料
使用URL=> http://localhost:8080/SpringRestfulServer/
findBookById
/1
發送請求
這邊也是因為設定@ResponseBody的關係,回傳結果即為剛才暫存的Id=1 的Book物件內容

然而回傳結果Response Header部分顯示的Content-Type 為text/book
