1. 程式人生 > >如何在spring mvc restful介面中定製化型別轉換和格式化

如何在spring mvc restful介面中定製化型別轉換和格式化

 

1.痛點

最近小胖哥搞了個小程式,有幾個spring mvc 介面傳遞了時間,時間用java 8 time 相關的api 來直接接收:

當使用根據ISO 8601格式化的引數向任何這些方法傳送POST請求時,報出瞭如下異常:

這是因為預設情況下Spring不能將String引數轉換為任何日期或時間物件。下面小胖哥就來帶大家來搞一搞如何在spring mvc中進行型別轉換和格式化操作,webflux也是同樣的機制。多多關注碼農小胖哥,更多it知識分享。

2.在請求級別轉換日期引數

其中的一個解決方案是使用@DateTimeFormat 註釋註釋引數 並提供格式設定模式引數,我們將上面的方法改動一下:

這樣,如果使用ISO 8601格式格式化字串,則字串將正確轉換為日期物件。

我們也可以使用自己的轉換模式。我們可以在@DateTimeFormat註釋中提供一個模式引數 :

3.在應用程式級別轉換日期引數

在Spring中處理日期和時間物件轉換的另一種方法是提供全域性配置。我們可以通過自動化配置類WebMvcAutoConfiguration中找到相關的處理機制:

重點是該類的引數:

我們指定了格式就可以自動轉換了。通過此約定配置我們可以指定一個統一的處理風格。我們注意到在初始化FormattingConversionService呼叫了addFormatters(FormatterRegistry registry),我們找到了該方法的具體實現:

我們發現Converter、GenericConverter、Formatter 三種類型的的Spring bean 都可以被自動注入到格式化註冊機中去。當然只要註冊了就可以在應用中起作用。下面小胖哥就來介紹它們。

4. 轉換器

Converter<S,T>是一個函式介面。作用是將泛型S 轉換為T,也就是型別轉換器,可以實現String 到 Integer,String到LocalDate等不同型別之間的轉換。特別指出的是,一定要確保S型別不能為null,而且保證該實現一定是執行緒安全的。如果你有集中轉換的需要可以實現工廠轉換器介面ConverterFactory。

GenericConverter是兩種或更多種型別之間轉換的通用轉換器介面,最為靈活的轉換介面,通過上面的片段可以知道,通過構建多個源資料到轉換目標的唯一對映對ConvertiblePair可以實現一對多、多對多的轉換關係 。

5. 格式化器

 

Formatter介面用於實現欄位格式化邏輯而且是強型別化的,該介面是組合介面。Printer<T>是將物件輸出為展示時的字串,而Parser<T> 則相反將字串格式化為目標物件,甚至可以結合本地化。比如像上面將yyyy-MM-dd 的字串格式化為 LocalDate。

6. 總結

我們學習瞭如何接受Spring MVC請求中的日期引數。而且我們也介紹瞭如何在區域性和全域性使用它們,通過延伸探索,我們也知道了它們的一些執行機制,如何的轉換型別以及格式化,而且通過實現轉換器、格式化器介面 並注入spring bean 就可以工作。可以根據我的介紹實際演練一下。

多多關注我的公眾號:碼農小胖哥 ,有更多技術乾貨分享。