回覆列表
  • 1 # java架構設計

    要想自己定製HTTP訊息轉換器必須先知道SpringBoot預設是怎麼做HTTP訊息轉換的。

    先來看我們平常工作中開發一個簡單的get請求:

    那麼當前端請求我們的API的時候,我們是如何將網路傳輸的位元組流序列化成我們想要的物件呢?做完業務處理後又是如何返回資料呢?

    HttpMessageConverter

    在SpringBoot框架下,可以使用@RequestBody和@ResponseBody兩個註解,分別完成請求報文到物件和物件到響應報文的轉換,底層這種靈活的訊息轉換機制,就是Spring3.x中新引入的HttpMessageConverter即訊息轉換器機制。

    開啟任何一個集成了Spring-web功能的SpringBoot專案,都可以找到這個HttpMessageConvert:

    可以看到他是一個介面類,和他在一個包下面有很多實現類,感興趣的同學可以debug跟進去把這塊原始碼搞透,這個過程中大家還可以學習到很多關於序列化的知識。

    原始碼解析:怎麼知道SpringBoot中的預設convert

    在專案的啟動類Application.class上有一個@SpringBootApplication註解,點進去會看到他是一系列註解的包含,其中有一個@EnableAutoConfiguration註解,繼續點進去檢視:

    發現引入了一個類:AutoConfigurationImportSelector類,繼續跟進去有一個方法selectImports():

    到這一步相信大家就清晰了他是怎麼載入的了:

    繼續走下去就知道如何載入訊息的預設convert,這裡就不和大家說答案,希望大家自己可以跟進去看看,收穫是不一樣的~

    定製自己的convert

    知道了訊息轉換器的原理以及SpringBoot中如何載入的,我們就知道如何去定製自己的訊息轉換器了,先實現自己的一個convert,繼承AbstractHttpMessageConverter:

    然後定義一個WebConfig類繼承WebMvcConfigurer,把我們自定義的這個convert加進去:

    實際工作中,大家可能很多時候並不需要自己去實現convert,用預設的訊息轉換器就可以了,除非大家有自己特殊的需求考慮,否則不建議非得自己去實現這個convert。

  • 中秋節和大豐收的關聯?
  • 為什麼蘋果充滿電一會兒就沒電了?