Property Converters

虽然基于类型的转换已经提供了影响目标存储中某些类型的转换和表示的方法,但在只应考虑转换特定类型的某些值或属性时,它具有局限性。 基于属性的转换器允许基于每个属性配置转换规则,无论是声明式 (通过 ) 还是编程式 (通过为特定属性注册)。@ValueConverterPropertyValueConverterspring-doc.cn

A 可以将给定的值转换为其 store 表示形式 (write) 并返回 (read),如下面的清单所示。 附加功能提供其他信息,如映射元数据和 direct 和 methods。PropertyValueConverterValueConversionContextreadwritespring-doc.cn

示例 1.一个简单的 PropertyValueConverter
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);
  }
}

您可以通过委托 来获取实例,通常是通过使用 a 来提供实际的转换器。 根据应用程序的需要,您可以链接或装饰 的多个实例,例如,应用缓存。 默认情况下, Spring Data MongoDB 使用缓存实现,该实现可以为具有默认构造函数或枚举值的类型提供服务。 一组预定义的工厂可通过 中的工厂方法获得。 您可以使用 从 .PropertyValueConverterCustomConversions#getPropertyValueConverter(…)PropertyValueConversionsPropertyValueConverterFactoryPropertyValueConverterFactoryPropertyValueConverterFactoryPropertyValueConverterFactory.beanFactoryAware(…)PropertyValueConverterApplicationContextspring-doc.cn

您可以通过 更改默认行为。ConverterConfigurationspring-doc.cn

声明式值转换器

a 最直接的用法是使用定义转换器类型的 annotation 来注释 properties:PropertyValueConverter@ValueConverterspring-doc.cn

示例 2.声明式 PropertyValueConverter
class Person {

  @ValueConverter(ReversingValueConverter.class)
  String ssn;
}

程序化值转换器注册

编程注册使用 为实体模型中的属性注册实例,如下例所示。 声明式注册和编程式注册之间的区别在于,编程式注册完全发生在实体模型之外。 如果您无法或不想对实体模型进行批注,则此方法非常有用。PropertyValueConverterPropertyValueConverterRegistrarspring-doc.cn

例 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 类型安全的变体,允许注册转换器及其转换函数。 此方法使用类代理来确定属性。 确保 class 和 accessors 都不是,否则此方法不起作用。final
注册转换器时,不支持用于将属性跨 nagiv 到子文档中的点表示法 (如 )。registerConverter(Person.class, "address.street", …)
MongoValueConverter提供使用 .PropertyValueConverterMongoConversionContext

MongoCustomConversions 配置

默认情况下,可以处理声明性值转换器,具体取决于配置的 . 帮助设置程序化值转化或定义要使用的。MongoCustomConversionsPropertyValueConverterFactoryMongoConverterConfigurationAdapterPropertyValueConverterFactoryspring-doc.cn

示例 4.配置示例
MongoCustomConversions.create(configurationAdapter -> {

    SimplePropertyValueConversions valueConversions = new SimplePropertyValueConversions();
    valueConversions.setConverterFactory(…);
    valueConversions.setValueConverterRegistry(new PropertyValueConverterRegistrar()
        .registerConverter(…)
        .buildRegistry());

    configurationAdapter.setPropertyValueConversions(valueConversions);
});