如何解决如何为Spring Data Cassandra创建自定义转换?
为了使用“货币”和“语言环境”作为数据类型,我无法创建自定义转换。
我使用的是带有@Configuration
的带注释的类,该类将通过META-INF/spring.factories
自动配置:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.acme.autoconfigure.ConverterAutoConfiguration
我尝试将转换器直接注册为bean,还尝试创建CassandraCustomConversions
bean,但没有成功:
@Configuration
public class ConverterAutoConfiguration {
/*
@Bean
public Converter<String,Currency> currencyReadConverter() {
return new Converter<String,Currency>() {
@Override
public Currency convert(String source) {
return Currency.getInstance(source);
}
};
}
@Bean
public Converter<Currency,String> currencyWriteConverter() {
return new Converter<Currency,String>() {
@Override
public String convert(Currency source) {
return source.toString();
}
};
}
@Bean
public Converter<String,Locale> localeReadConverter() {
return new Converter<String,Locale>() {
@Override
public Locale convert(String source) {
return StringUtils.parseLocaleString(source);
}
};
}
@Bean
public Converter<Locale,String> localeWriteConverter() {
return new Converter<Locale,String>() {
@Override
public String convert(Locale source) {
return source.toString();
}
};
}
*/
@Bean
public CassandraCustomConversions cassandraCustomConversions() {
List<Converter<?,?>> converters = new ArrayList<>();
converters.add(CurrencyReadConverter.INSTANCE);
converters.add(CurrencyWriteConverter.INSTANCE);
converters.add(LocaleReadConverter.INSTANCE);
converters.add(LocaleWriteConverter.INSTANCE);
return new CassandraCustomConversions(converters);
}
enum CurrencyReadConverter implements Converter<String,Currency> {
INSTANCE;
@Override
public Currency convert(String source) {
return Currency.getInstance(source);
}
}
enum CurrencyWriteConverter implements Converter<Currency,String> {
INSTANCE;
@Override
public String convert(Currency source) {
return source.toString();
}
}
enum LocaleReadConverter implements Converter<String,Locale> {
INSTANCE;
@Override
public Locale convert(String source) {
return StringUtils.parseLocaleString(source);
}
}
enum LocaleWriteConverter implements Converter<Locale,String> {
INSTANCE;
@Override
public String convert(Locale source) {
return source.toString();
}
}
}
使用CassandraCustomConversions
bean,我在启动时直接遇到了异常:
Caused by: org.springframework.data.mapping.MappingException: Cannot resolve DataType for type [class java.lang.String] for property [categoryId] in entity [com.acme.model.Category]; Consider registering a Converter or annotating the property with @CassandraType.
似乎丢失了所有默认映射。
直接使用转换器bean时,出现以下异常:
org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract reactor.core.publisher.Flux com.acme.repository.CategoryLocaleReactiveRepository.findByUriNameInAndKeyLocale(java.util.Collection,java.util.Locale)! Reason: Could not inline literal of type java.util.Locale. This happens because the driver doesn't know how to map it to a CQL type. Try passing a TypeCodec or CodecRegistry to literal().
基于此问题,应该可以通过以下方式实现:https://github.com/spring-projects/spring-boot/issues/8411
解决方法
尝试将@WritingConverter
和@ReadingConverter
添加到您的转换器中。我认为spring在决定使用非自定义类型使用哪个转换器方面有些困难。
我创建了一个本地项目,并成功将Locale
和Currency
的转换工作成功地将这两个注释添加到适当的转换器中。
如果您仍有问题,我可以将我的测试项目推送到Github上并分享。
参考:https://docs.spring.io/spring-data/cassandra/docs/current/reference/html/#customconversions.java
示例项目:https://github.com/michaelmcfadyen/spring-data-cassandra-custom-converter-example
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。