此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Data MongoDB 4.5.2spring-doc.cadn.net.cn

属性转换器

虽然基于类型的转换已经提供了影响目标存储中某些类型的转换和表示的方法,但当仅考虑特定类型的某些值或属性进行转换时,它存在局限性。 基于属性的转换器允许以声明方式(通过@ValueConverter)或以编程方式(通过注册PropertyValueConverter)。spring-doc.cadn.net.cn

一个PropertyValueConverter可以将给定值转换为其存储表示(写入)和返回(读取),如以下列表所示。 附加的ValueConversionContext提供附加信息,例如映射元数据和直接readwrite方法。spring-doc.cadn.net.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);
  }
}

您可以获得PropertyValueConverter实例来自CustomConversions#getPropertyValueConverter(…)通过委托给PropertyValueConversions,通常通过使用PropertyValueConverterFactory提供实际的转换器。 根据应用程序的需求,您可以链接或修饰PropertyValueConverterFactory- 例如,应用缓存。 默认情况下,Spring Data MongoDB 使用缓存实现,该实现可以提供具有默认构造函数或枚举值的类型。 一组预定义的工厂可通过PropertyValueConverterFactory. 您可以使用PropertyValueConverterFactory.beanFactoryAware(…)获取PropertyValueConverter实例ApplicationContext.spring-doc.cadn.net.cn

您可以通过以下方式更改默认行为ConverterConfiguration.spring-doc.cadn.net.cn

声明式值转换器

最直接的用法PropertyValueConverter是通过使用@ValueConverter定义转换器类型的注释:spring-doc.cadn.net.cn

示例 2.声明性属性值转换器
class Person {

  @ValueConverter(ReversingValueConverter.class)
  String ssn;
}

程序化价值转换器注册

编程注册寄存器PropertyValueConverter实体模型中属性的实例,方法是使用PropertyValueConverterRegistrar,如以下示例所示。 声明性注册和程序化注册之间的区别在于,程序化注册完全发生在实体模型之外。 如果您不能或不想注释实体模型,则这种方法很有用。spring-doc.cadn.net.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 类型安全变体,允许注册转换器及其转换功能。 此方法使用类代理来确定属性。 确保类和访问器都不是final否则这种方法不起作用。
点表示法(例如registerConverter(Person.class, "address.street", …)) 在注册转换器时不支持跨属性导航到子文档。
MongoValueConverter提供预先键入的PropertyValueConverter使用MongoConversionContext.

MongoCustomConversions 配置

默认情况下,MongoCustomConversions可以处理声明性值转换器,具体取决于配置的PropertyValueConverterFactory.MongoConverterConfigurationAdapter有助于设置程序化值转换或定义PropertyValueConverterFactory待使用。spring-doc.cadn.net.cn

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

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

    configurationAdapter.setPropertyValueConversions(valueConversions);
});