基于属性的转换器
虽然基于类型的转换已经提供了影响目标存储中某些类型的转换和表示的方法,但在只应考虑转换特定类型的某些值或属性时,它具有局限性。
基于属性的转换器允许基于每个属性配置转换规则,无论是声明式的(通过@ValueConverter) 或编程方式(通过注册PropertyValueConverter对于特定属性)。
一个PropertyValueConverter可以将给定的值转换为其 store 表示形式(write)和返回(read),如下面的清单所示。
附加的ValueConversionContext提供其他信息,例如映射元数据和直接read和write方法。
PropertyValueConverterclass 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.
您可以通过ConverterConfiguration.
声明式值转换器
最直接的 aPropertyValueConverter是通过使用@ValueConverter定义 converter 类型的注解:
class Person {
@ValueConverter(ReversingValueConverter.class)
String ssn;
}
程序化值转换器注册
编程注册寄存器PropertyValueConverter实体模型中属性的实例PropertyValueConverterRegistrar,如下例所示。
声明式注册和编程式注册之间的区别在于,编程式注册完全发生在实体模型之外。
如果您无法或不想对实体模型进行批注,则此方法非常有用。
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 | 类型安全的变体,允许注册转换器及其转换函数。
此方法使用类代理来确定属性。
确保 class 和 accessors 都不是final否则,此方法将不起作用。 |
点表示法(例如registerConverter(Person.class, "address.street", …)) 在注册转换器时,不支持将 property 跨 nagiving 到嵌套对象中。 |
如果转换器是PropertyValueConverter类。
无法从 lambda 确定泛型,使用 lambda 将回退到属性类型。 |
CassandraValueConverter提供预打字PropertyValueConverter接口,该接口使用CassandraConversionContext. |
CassandraCustomConversions 配置
默认情况下,CassandraCustomConversions可以处理声明式值转换器,具体取决于配置的PropertyValueConverterFactory.CassandraConverterConfigurationAdapter帮助您设置程序化值转化或定义PropertyValueConverterFactory使用或注册转换器。
CassandraCustomConversions conversions = CassandraCustomConversions.create(adapter -> {
adapter.registerConverter(…);
adapter.configurePropertyConversions(registrar -> {
registrar.registerConverter(Person.class, "name", String.class)
.writing((from, ctx) -> …)
.reading((from, ctx) -> …);
});
});