虽然基于类型的转换已经提供了影响目标存储中某些类型的转换和表示形式的方法,但当仅应考虑转换特定类型的某些值或属性时,它具有局限性。 基于属性的转换器允许以声明方式(通过 )或编程方式(通过为特定属性注册 a)为每个属性配置转换规则。@ValueConverterPropertyValueConverterSpring中文文档

A 可以将给定值转换为其存储表示形式(写入)和返回(读取),如下表所示。 附加项提供了其他信息,例如映射元数据以及直接和方法。PropertyValueConverterValueConversionContextreadwriteSpring中文文档

例 1.一个简单的PropertyValueConverter
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);
	}

}

您可以通过委托 来获取实例,通常使用 提供实际转换器。 根据应用程序的需求,您可以链接或修饰多个实例,例如,应用缓存。 默认情况下,Spring Data Cassandra 使用缓存实现,该实现可以为具有默认构造函数或枚举值的类型提供服务。 一组预定义的工厂可通过 中的工厂方法获得。 您可以使用从 .PropertyValueConverterCustomConversions#getPropertyValueConverter(…)PropertyValueConversionsPropertyValueConverterFactoryPropertyValueConverterFactoryPropertyValueConverterFactoryPropertyValueConverterFactory.beanFactoryAware(…)PropertyValueConverterApplicationContextSpring中文文档

您可以通过 更改默认行为。ConverterConfigurationSpring中文文档

声明性值转换器

a 最直接的用法是使用定义转换器类型的注释来注释属性:PropertyValueConverter@ValueConverterSpring中文文档

例 2.声明性 PropertyValueConverter
class Person {

  @ValueConverter(ReversingValueConverter.class)
  String ssn;
}

编程值转换器注册

编程注册通过使用 注册实体模型中的属性注册实例,如以下示例所示。 声明式注册和程序化注册之间的区别在于,程序化注册完全发生在实体模型之外。 如果不能或不想对实体模型进行批注,则此方法非常有用。PropertyValueConverterPropertyValueConverterRegistrarSpring中文文档

例 3.编程 PropertyValueConverter 注册
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", …)
如果转换器是一个类,则架构派生只能从已注册的转换器派生列类型。 泛型无法从 lambda 中确定,使用 lambda 将回退到属性类型。PropertyValueConverter
CassandraValueConverter提供了一个使用 .PropertyValueConverterCassandraConversionContext
1 为由其名称标识的字段注册转换器。
2 类型安全变体,允许注册转换器及其转换功能。 此方法使用类代理来确定属性。 请确保类和访问器都不是,否则此方法不起作用。final
注册转换器时,支持将属性跨属性划分为嵌套对象的点表示法(例如 )。registerConverter(Person.class, "address.street", …)
如果转换器是一个类,则架构派生只能从已注册的转换器派生列类型。 泛型无法从 lambda 中确定,使用 lambda 将回退到属性类型。PropertyValueConverter
CassandraValueConverter提供了一个使用 .PropertyValueConverterCassandraConversionContext

CassandraCustomConversions 配置

默认情况下,可以处理声明性值转换器,具体取决于配置的 . 帮助您设置编程值转换或定义要使用的或注册转换器。CassandraCustomConversionsPropertyValueConverterFactoryCassandraConverterConfigurationAdapterPropertyValueConverterFactorySpring中文文档

例 4.配置示例
CassandraCustomConversions conversions = CassandraCustomConversions.create(adapter -> {
  adapter.registerConverter(…);
  adapter.configurePropertyConversions(registrar -> {
    registrar.registerConverter(Person.class, "name", String.class)
        .writing((from, ctx) -> …)
        .reading((from, ctx) -> …);
  });
});