虽然基于类型的转换已经提供了影响目标存储中某些类型的转换和表示形式的方法,但当仅应考虑转换特定类型的某些值或属性时,它具有局限性。 基于属性的转换器允许以声明方式(通过 )或编程方式(通过为特定属性注册 a)为每个属性配置转换规则。@ValueConverterPropertyValueConverterSpring中文文档

A 可以将给定值转换为其存储表示形式(写入)和返回(读取),如下表所示。 附加项提供了其他信息,例如映射元数据以及直接和方法。PropertyValueConverterValueConversionContextreadwriteSpring中文文档

例 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);
  }
}

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

您可以通过 更改默认行为。ConverterConfigurationSpring中文文档

声明性值转换器

a 最直接的用法是使用定义转换器类型的注释来注释属性:PropertyValueConverter@ValueConverterSpring中文文档

例 2.声明性 PropertyValueConverter
class Person {

  @ValueConverter(ReversingValueConverter.class)
  String ssn;
}

编程值转换器注册

编程注册通过使用 注册实体模型中的属性注册实例,如以下示例所示。 声明式注册和程序化注册之间的区别在于,程序化注册完全发生在实体模型之外。 如果不能或不想对实体模型进行批注,则此方法非常有用。PropertyValueConverterPropertyValueConverterRegistrarSpring中文文档

例 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提供了一个使用 .PropertyValueConverterMongoConversionContext
1 为由其名称标识的字段注册转换器。
2 类型安全变体,允许注册转换器及其转换功能。 此方法使用类代理来确定属性。 请确保类和访问器都不是,否则此方法不起作用。final
注册转换器时,支持将属性跨属性引入子文档的点表示法(例如 )。registerConverter(Person.class, "address.street", …)
MongoValueConverter提供了一个使用 .PropertyValueConverterMongoConversionContext

MongoCustomConversions 配置

默认情况下,可以处理声明性值转换器,具体取决于配置的 . 帮助设置编程值转换或定义要使用的值。MongoCustomConversionsPropertyValueConverterFactoryMongoConverterConfigurationAdapterPropertyValueConverterFactorySpring中文文档

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

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

    configurationAdapter.setPropertyValueConversions(valueConversions);
});