【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);
});
相关推荐
沐浴露z19 分钟前
【Java SpringAI智能体开发学习 | 2】SpringAI 实用特性:自定义Advisor,结构化输出,对话记忆持久化,prompt模板,多模态
java·spring·springai
小沈同学呀23 分钟前
创建一个Spring Boot Starter风格的Basic认证SDK
java·spring boot·后端
码农小伙1 小时前
通俗易懂地讲解JAVA的BIO、NIO、AIO
java·nio
不要再敲了2 小时前
JDBC从入门到面试:全面掌握Java数据库连接技术
java·数据库·面试
潇I洒2 小时前
若依4.8.1打包war后在Tomcat无法运行,404报错的一个解决方法
java·tomcat·ruoyi·若依·404
Funcy3 小时前
XxlJob 源码分析05:执行器注册流程
java
Boop_wu3 小时前
[数据结构] 队列 (Queue)
java·jvm·算法
无敌的神原秋人3 小时前
关于Redis不同序列化压缩性能的对比
java·redis·缓存
Chan163 小时前
JVM从入门到实战:从字节码组成、类生命周期到双亲委派及打破双亲委派机制
java·jvm·spring boot·后端·intellij-idea