【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);
});
相关推荐
掉鱼的猫39 分钟前
Solon AI + MCP实战:5行代码搞定天气查询,LLM从此告别数据孤岛
java·openai·mcp
带刺的坐椅1 小时前
Solon AI + MCP实战:5行代码搞定天气查询,LLM从此告别数据孤岛
java·mcp·solon-ai
androidwork2 小时前
嵌套滚动交互处理总结
android·java·kotlin
草履虫建模2 小时前
Tomcat 和 Spring MVC
java·spring boot·spring·spring cloud·tomcat·mvc·intellij-idea
枣伊吕波2 小时前
第十三节:第七部分:Stream流的中间方法、Stream流的终结方法
java·开发语言
天天摸鱼的java工程师2 小时前
Kafka是如何保证消息队列中的消息不丢失、不重复?
java·后端·kafka
天天摸鱼的java工程师2 小时前
SpringBoot 自动配置原理?@EnableAutoConfiguration 是如何工作的?
java·后端
一点也不想取名2 小时前
解决 Java 与 JavaScript 之间特殊字符传递问题的终极方案
java·开发语言·javascript
27669582923 小时前
朴朴超市小程序 sign-v2 分析
java·python·小程序·逆向分析·朴朴超市·sign-v2·朴朴
im_AMBER3 小时前
java复习 11
java·开发语言