【Spring連載】使用Spring Data訪問 MongoDB----對象映射之屬性轉換器
- 一、聲明式值轉換器
- 二、編程式值轉換器注冊
- 三、MongoCustomConversions配置
雖然基于類型的轉換已經提供了影響目標存儲中某些類型的轉換和表示的方法,但當僅考慮特定類型的某些值或屬性進行轉換時,它會受到限制。基于屬性的轉換器允許以聲明方式(通過@ValueConverter)或編程方式(通過為特定屬性注冊PropertyValueConverter)按每個屬性配置轉換規則。
PropertyValueConverter可以將給定值轉換為其存儲表示形式(寫入)和返回(讀取),如下所示。額外的ValueConversionContext提供了額外的信息,例如映射元數據和直接讀寫方法。
例1:一個簡單的PropertyValueConverter
class ReversingValueConverter implements PropertyValueConverter<String, String, ValueConversionContext> {@Overridepublic String read(String value, ValueConversionContext context) {return reverse(value);}@Overridepublic String write(String value, ValueConversionContext context) {return reverse(value);}
}
你可以通過委托給PropertyValueConversions,通常通過使用PropertyValueConverterFactory來提供實際的轉換器,從CustomConversions#getPropertyValueConverter(…)獲得PropertyValueConverter實例。根據應用程序的需要,可以鏈接(chain)或裝飾(decorate)PropertyValueConverterFactory的多個實例?—?例如應用caching。默認情況下,Spring Data MongoDB使用緩存實現,該實現可以為具有默認構造函數或枚舉值的類型提供服務。一組預定義的工廠可通過PropertyValueConverterFactory中的工廠方法獲得。你可以使用PropertyValueConverterFactory.beanFactoryAware(…)從ApplicationContext獲取PropertyValueConverter實例。
你可以通過ConverterConfiguration更改默認行為。
一、聲明式值轉換器
PropertyValueConverter最直接的用法是用@ValueConverter注釋屬性,該注釋定義了轉換器類型:例2:聲明式PropertyValueConverter
class Person {@ValueConverter(ReversingValueConverter.class)String ssn;
}
二、編程式值轉換器注冊
編程式注冊通過使用PropertyValueConverterRegistrar為實體模型中的屬性注冊PropertyValueConverter實例,如下面的示例所示。聲明性注冊和編程式注冊的區別在于編程式注冊完全發生在實體模型之外。如果不能或不想注解實體模型,這種方法很有用。
例3:編程式PropertyValueConverter注冊
PropertyValueConverterRegistrar registrar = new PropertyValueConverterRegistrar();registrar.registerConverter(Address.class, "street", new PropertyValueConverter() { … }); --------1// type safe registration
registrar.registerConverter(Person.class, Person::getSsn()) --------2.writing(value -> encrypt(value)).reading(value -> decrypt(value));1. 為由其名稱標識的字段注冊一個轉換器。
2. 允許注冊轉換器及其轉換函數的類型安全變量。此方法使用類代理來確定屬性。確保類和訪問器都不是final,否則此方法不起作用。
在注冊轉換器時,不支持通過點表示法(如registerConverter(Person.class, “address.street”, …))將屬性轉換為子文檔。MongoValueConverter提供了一個預類型化的PropertyValueConverter接口,它使用了MongoConversionContext。
三、MongoCustomConversions配置
默認情況下,MongoCustomConversions可以處理聲明式值轉換器,具體取決于配置的PropertyValueConverterFactory。MongoConverterConfigurationAdapter幫助設置可編程的值轉換或定義要使用的PropertyValueConverterFactory。
例4:配置示例
MongoCustomConversions.create(configurationAdapter -> {SimplePropertyValueConversions valueConversions = new SimplePropertyValueConversions();valueConversions.setConverterFactory(…);valueConversions.setValueConverterRegistry(new PropertyValueConverterRegistrar().registerConverter(…).buildRegistry());configurationAdapter.setPropertyValueConversions(valueConversions);
});