大部分人的第一反應是通過 Spring 攔截器(Interceptor)中的postHandler
方法處理。實際這是行不通的,因爲當程序運行到該方法,是在返回數據之後,渲染頁面之前,所以這時候 Response 中的輸出流已經關閉了,自然無法在對返回數據進行處理。
其實這個問題用幾行代碼就可以搞定,因爲 Spring 提供了非常豐富的擴展支持,無論是之前提到的Interceptor
和MethodArgumentResolver
,還是接下來要提到的HttpMessageConverter
。
在 Spring MVC 的 Controller 層經常會用到@RequestBody
和@ResponseBody
,通過這兩個註解,可以在 Controller 中直接使用 Java 對象作爲請求參數和返回內容,而完成這之間轉換作用的便是HttpMessageConverter
。
HttpMessageConverter
接口提供了 5 個方法:
canRead
:判斷該轉換器是否能將請求內容轉換成 Java 對象canWrite
:判斷該轉換器是否可以將 Java 對象轉換成返回內容getSupportedMediaTypes
:獲得該轉換器支持的 MediaType 類型read
:讀取請求內容並轉換成 Java 對象-
write
:將 Java 對象轉換後寫入返回內容其中
read
和write
方法的參數分別有有HttpInputMessage
和HttpOutputMessage
對象,這兩個對象分別代表着一次 Http 通訊中的請求和響應部分,可以通過getBody
方法獲得對應的輸入流和輸出流。
具體步驟:這裏使用的springBoot的方法進行配置
具體使用的springBoot的方法進行配置:https://suxiexingchen.github.io/2019/08/21/10/