对于最新的稳定版本,请使用 Spring Data MongoDB 4.4.0! |
Property Converters
虽然基于类型的转换已经提供了影响目标存储中某些类型的转换和表示的方法,但在只应考虑转换特定类型的某些值或属性时,它具有局限性。
基于属性的转换器允许基于每个属性配置转换规则,无论是声明式的(通过@ValueConverter
) 或编程方式(通过注册PropertyValueConverter
对于特定属性)。
一个PropertyValueConverter
可以将给定的值转换为其 store 表示形式(write)和返回(read),如下面的清单所示。
附加的ValueConversionContext
提供其他信息,例如映射元数据和直接read
和write
方法。
class ReversingValueConverter implements PropertyValueConverter<String, String, ValueConversionContext> {
@Override
public String read(String value, ValueConversionContext context) {
return reverse(value);
}
@Override
public String write(String value, ValueConversionContext context) {
return reverse(value);
}
}
您可以获得PropertyValueConverter
实例CustomConversions#getPropertyValueConverter(…)
通过委托给PropertyValueConversions
,通常使用PropertyValueConverterFactory
以提供实际的转换器。
根据应用程序的需要,您可以链接或装饰PropertyValueConverterFactory
— 例如,应用缓存。
默认情况下, Spring Data MongoDB 使用缓存实现,该实现可以为具有默认构造函数或枚举值的类型提供服务。
一组预定义的工厂可通过PropertyValueConverterFactory
.
您可以使用PropertyValueConverterFactory.beanFactoryAware(…)
要获取PropertyValueConverter
实例ApplicationContext
.
您可以通过ConverterConfiguration
.
声明式值转换器
最直接的 aPropertyValueConverter
是通过使用@ValueConverter
定义 converter 类型的注解:
class Person {
@ValueConverter(ReversingValueConverter.class)
String ssn;
}
程序化值转换器注册
编程注册寄存器PropertyValueConverter
实体模型中属性的实例PropertyValueConverterRegistrar
,如下例所示。
声明式注册和编程式注册之间的区别在于,编程式注册完全发生在实体模型之外。
如果您无法或不想对实体模型进行批注,则此方法非常有用。
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 | 类型安全的变体,允许注册转换器及其转换函数。
此方法使用类代理来确定属性。
确保 class 和 accessors 都不是final 否则,此方法将不起作用。 |
点表示法(例如registerConverter(Person.class, "address.street", …) ) 在注册转换器时,不支持将跨属性转换为子文档。 |
MongoValueConverter 提供预打字PropertyValueConverter 接口,该接口使用MongoConversionContext . |
MongoCustomConversions 配置
默认情况下,MongoCustomConversions
可以处理声明式值转换器,具体取决于配置的PropertyValueConverterFactory
.MongoConverterConfigurationAdapter
帮助设置程序化值转化或定义PropertyValueConverterFactory
以供使用。
MongoCustomConversions.create(configurationAdapter -> {
SimplePropertyValueConversions valueConversions = new SimplePropertyValueConversions();
valueConversions.setConverterFactory(…);
valueConversions.setValueConverterRegistry(new PropertyValueConverterRegistrar()
.registerConverter(…)
.buildRegistry());
configurationAdapter.setPropertyValueConversions(valueConversions);
});