对于最新的稳定版本,请使用 Spring Data Cassandra 4.5.2spring-doc.cadn.net.cn

基于属性的转换器

虽然基于类型的转换已经提供了影响目标存储中某些类型的转换和表示的方法,但当仅应考虑特定类型的某些值或属性进行转换时,它存在局限性。基于属性的转换器允许以声明方式(通过@ValueConverter)或以编程方式(通过注册PropertyValueConverter)。spring-doc.cadn.net.cn

一个PropertyValueConverter可以将给定值转换为其存储表示(写入)和返回(读取),如以下列表所示。附加ValueConversionContext提供附加信息,例如映射元数据和直接readwrite方法。spring-doc.cadn.net.cn

示例 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);
	}

}

您可以获得PropertyValueConverter实例来自CustomConversions#getPropertyValueConverter(…)通过委托给PropertyValueConversions,通常通过使用PropertyValueConverterFactory以提供实际的转换器。根据应用程序的需求,您可以链接或修饰PropertyValueConverterFactory——例如,应用缓存。默认情况下,Spring Data Cassandra 使用缓存实现,该实现可以提供具有默认构造函数或枚举值的类型。一组预定义的工厂可通过PropertyValueConverterFactory. 您可以使用PropertyValueConverterFactory.beanFactoryAware(…)获取PropertyValueConverter实例ApplicationContext.spring-doc.cadn.net.cn

您可以通过以下方式更改默认行为ConverterConfiguration.spring-doc.cadn.net.cn

声明式值转换器

最直接的用法PropertyValueConverter是通过使用@ValueConverter定义转换器类型的注释:spring-doc.cadn.net.cn

示例 2.声明性 PropertyValueConverter
class Person {

  @ValueConverter(ReversingValueConverter.class)
  String ssn;
}

程序化价值转换器注册

编程注册寄存器PropertyValueConverter实体模型中属性的实例,方法是使用PropertyValueConverterRegistrar,如以下示例所示。声明性注册和编程式注册之间的区别在于,编程式注册完全发生在实体模型之外。如果您不能或不想对实体模型进行注释,则这种方法非常有用。spring-doc.cadn.net.cn

示例 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", …)) 在注册转换器时不支持跨属性导航到嵌套对象。
架构派生只能从已注册的转换器派生列类型,如果转换器是PropertyValueConverter类。 泛型无法从 lambda 确定,使用 lambda 将回退到属性类型。
CassandraValueConverter提供预先键入的PropertyValueConverter使用CassandraConversionContext.

CassandraCustomConversions 配置

默认情况下,CassandraCustomConversions可以处理声明性值转换器,具体取决于配置的PropertyValueConverterFactory.CassandraConverterConfigurationAdapter帮助您设置程序化值转换或定义PropertyValueConverterFactory用于使用或注册转换器。spring-doc.cadn.net.cn

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