自定義轉換
以下是 Spring Converter
實現的一個示例,它將 String
轉換為自定義的 Email
值物件
@ReadingConverter
public class EmailReadConverter implements Converter<String, Email> {
public Email convert(String source) {
return Email.valueOf(source);
}
}
如果您編寫的 Converter
的源型別和目標型別是原生型別,我們無法確定應將其視為讀取轉換器還是寫入轉換器。將轉換器例項同時註冊為兩者可能會導致意外結果。例如,Converter<String, Long>
是模糊的,儘管在寫入時嘗試將所有 String
例項轉換為 Long
例項可能沒有意義。為了讓您強制基礎設施僅以一種方式註冊轉換器,我們提供了 @ReadingConverter
和 @WritingConverter
註解,用於轉換器的實現中。
轉換器需要顯式註冊,因為不會從 classpath 或容器掃描中自動獲取例項,以避免不希望的轉換服務註冊以及由此產生的副作用。轉換器透過 CustomConversions
進行註冊,它是一個核心設施,允許根據源型別和目標型別註冊和查詢已註冊的轉換器。
CustomConversions
附帶了一組預定義的轉換器註冊
-
用於在
java.time
、java.util.Date
和String
型別之間轉換的 JSR-310 轉換器。
本地時間型別(例如 LocalDateTime 到 java.util.Date )的預設轉換器依賴於系統預設時區設定來進行型別轉換。您可以透過註冊自己的轉換器來覆蓋預設轉換器。 |
轉換器消歧
通常,我們會檢查 Converter
實現的源型別和目標型別。根據其中一種型別是否是底層資料訪問 API 原生支援的型別,我們將轉換器例項註冊為讀取轉換器或寫入轉換器。以下示例展示了一個寫入轉換器和一個讀取轉換器(請注意 Converter
上限定符順序的區別)
// Write converter as only the target type is one that can be handled natively
class MyConverter implements Converter<Person, String> { … }
// Read converter as only the source type is one that can be handled natively
class MyConverter implements Converter<String, Person> { … }