【Spring连载】使用Spring Data访问 MongoDB----对象映射之属性转换器

【Spring连载】使用Spring Data访问 MongoDB----对象映射之属性转换器

虽然基于类型的转换已经提供了影响目标存储中某些类型的转换和表示的方法,但当仅考虑特定类型的某些值或属性进行转换时,它会受到限制。基于属性的转换器允许以声明方式(通过@ValueConverter)或编程方式(通过为特定属性注册PropertyValueConverter)按每个属性配置转换规则。
PropertyValueConverter可以将给定值转换为其存储表示形式(写入)和返回(读取),如下所示。额外的ValueConversionContext提供了额外的信息,例如映射元数据和直接读写方法。
例1:一个简单的PropertyValueConverter

java 复制代码
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);
  }
}

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

你可以通过ConverterConfiguration更改默认行为。

一、声明式值转换器

PropertyValueConverter最直接的用法是用@ValueConverter注释属性,该注释定义了转换器类型:例2:声明式PropertyValueConverter

java 复制代码
class Person {

  @ValueConverter(ReversingValueConverter.class)
  String ssn;
}

二、编程式值转换器注册

编程式注册通过使用PropertyValueConverterRegistrar为实体模型中的属性注册PropertyValueConverter实例,如下面的示例所示。声明性注册和编程式注册的区别在于编程式注册完全发生在实体模型之外。如果不能或不想注解实体模型,这种方法很有用。
例3:编程式PropertyValueConverter注册

java 复制代码
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。
例4:配置示例

java 复制代码
MongoCustomConversions.create(configurationAdapter -> {

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

    configurationAdapter.setPropertyValueConversions(valueConversions);
});
相关推荐
Zayn~2 分钟前
JVM系列--虚拟机类加载机制
java
m0_748248028 分钟前
Redis使用手册
java
CoderCodingNo11 分钟前
【GESP】C++二级真题 luogu-b3924, [GESP202312 二级] 小杨的H字矩阵
java·c++·矩阵
2501_9032386535 分钟前
Spring MVC中环境配置的实战应用
java·spring·mvc·个人开发
程序员侠客行37 分钟前
Spring事务原理详解 三
java·后端·spring·架构
mjr1 小时前
设计模式-Java
java·设计模式
零星_AagT1 小时前
Apache-CC6链审计笔记
java·笔记·apache·代码审计
程序员张31 小时前
使用IDEA提交SpringBoot项目到Gitee上
java·gitee·intellij-idea
sunnyday04262 小时前
MyBatis XML映射文件中的批量插入和更新
xml·java·mysql·mybatis
程序员阿鹏2 小时前
jdbc批量插入数据到MySQL
java·开发语言·数据库·mysql·intellij-idea