【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);
});
相关推荐
皮皮林5513 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河3 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
桦说编程6 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅8 小时前
Java面向对象入门(类与对象,新手秒懂)
java
初次攀爬者8 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺8 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart10 小时前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
NE_STOP11 小时前
MyBatis-mybatis入门与增删改查
java
孟陬14 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端