最新的稳定版请使用 Spring Data MongoDB 4.3.1! |
最新的稳定版请使用 Spring Data MongoDB 4.3.1! |
虽然基于类型的转换已经提供了影响目标存储中某些类型的转换和表示形式的方法,但当仅应考虑转换特定类型的某些值或属性时,它具有局限性。
基于属性的转换器允许以声明方式(通过 )或编程方式(通过为特定属性注册 a)为每个属性配置转换规则。@ValueConverter
PropertyValueConverter
A 可以将给定值转换为其存储表示形式(写入)和返回(读取),如下表所示。
附加项提供了其他信息,例如映射元数据以及直接和方法。PropertyValueConverter
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);
}
}
您可以通过委托 来获取实例,通常使用 提供实际转换器。
根据应用程序的需求,您可以链接或修饰多个实例,例如,应用缓存。
默认情况下,Spring Data MongoDB使用缓存实现,该实现可以使用默认构造函数或枚举值提供类型。
一组预定义的工厂可通过 中的工厂方法获得。
您可以使用从 .PropertyValueConverter
CustomConversions#getPropertyValueConverter(…)
PropertyValueConversions
PropertyValueConverterFactory
PropertyValueConverterFactory
PropertyValueConverterFactory
PropertyValueConverterFactory.beanFactoryAware(…)
PropertyValueConverter
ApplicationContext
您可以通过 更改默认行为。ConverterConfiguration
声明性值转换器
a 最直接的用法是使用定义转换器类型的注释来注释属性:PropertyValueConverter
@ValueConverter
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 | 类型安全变体,允许注册转换器及其转换功能。
此方法使用类代理来确定属性。
请确保类和访问器都不是,否则此方法不起作用。final |
注册转换器时,不支持将属性跨属性引入子文档的点表示法(例如 )。registerConverter(Person.class, "address.street", …) |
MongoValueConverter 提供了一个使用 .PropertyValueConverter MongoConversionContext |
1 | 为由其名称标识的字段注册转换器。 |
2 | 类型安全变体,允许注册转换器及其转换功能。
此方法使用类代理来确定属性。
请确保类和访问器都不是,否则此方法不起作用。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);
});