【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);
});
相关推荐
栈与堆32 分钟前
LeetCode 19 - 删除链表的倒数第N个节点
java·开发语言·数据结构·python·算法·leetcode·链表
一路向北·重庆分伦34 分钟前
03-01:MQ常见问题梳理
java·开发语言
一 乐35 分钟前
绿色农产品销售|基于springboot + vue绿色农产品销售系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端·宠物
lhrimperial41 分钟前
企业智能知识库助手落地实践:从RAG到Multi-Agent
java·spring cloud·微服务·系统架构·知识图谱
3***68841 小时前
Spring Boot中使用Server-Sent Events (SSE) 实现实时数据推送教程
java·spring boot·后端
k***1951 小时前
Spring 核心技术解析【纯干货版】- Ⅶ:Spring 切面编程模块 Spring-Instrument 模块精讲
前端·数据库·spring
C***u1761 小时前
Spring Boot问题总结
java·spring boot·后端
Elieal1 小时前
5 种方式快速创建 SpringBoot 项目
java·spring boot·后端
better_liang1 小时前
每日Java面试场景题知识点之-Java修饰符
java·访问控制·static·abstract·final·修饰符·企业级开发
rgeshfgreh1 小时前
Spring事务传播机制深度解析
java·前端·数据库