自定義轉換

以下 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 註解,以便在轉換器實現中使用。

轉換器需要顯式註冊,因為例項不會從類路徑或容器掃描中拾取,以避免使用轉換服務進行不必要的註冊以及由此類註冊產生的副作用。轉換器透過 CustomConversions 註冊,CustomConversions 是一箇中心設施,允許註冊和查詢基於源型別和目標型別的已註冊轉換器。

CustomConversions 附帶了一組預定義的轉換器註冊

  • JSR-310 轉換器,用於在 java.timejava.util.DateString 型別之間進行轉換。

本地時間型別(例如,LocalDateTimejava.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> { … }