gpt4 book ai didi

spring - 自定义 Cassandra 转换器

转载 作者:行者123 更新时间:2023-12-04 12:29:55 27 4
gpt4 key购买 nike

我已经开始寻找很好的解决方案,如何使用 Spring CassandraOperations 很好地持久化实体。问题开始是因为我的实体中的某些字段不受 cassandra 支持,例如乔达日期时间。

解决方法是在 java.util.Date 类型的同一实体中添加其他字段,而不是 joda DateTime,用 @Transient 标记不需要的字段。但这并不干净,所以我开始寻找自动自定义转换。

目前 spring-data-cassandra 引用不提供如何注册自定义转换器的信息。 http://docs.spring.io/spring-data/cassandra/docs/current/reference/html/#cassandra.custom-converters

是否可以在 CassandraSessionFactoryBean 中注册自定义转换器(如 Spring Data Cassandra LocalDateTime Conversion )?

这是我的代码
@配置
公共(public)类 CassandraConfig {

@Value("${cassandra.contactpoints}")
private String cassandraContactPoint;

@Value("${cassandra.port}")
private int cassandraPort;

@Value("${cassandra.keyspace}")
private String cassandraKeySpace;

@Bean
public CassandraClusterFactoryBean cluster() {

CassandraClusterFactoryBean cluster = new CassandraClusterFactoryBean();
cluster.setContactPoints(cassandraContactPoint);
cluster.setPort(cassandraPort);

return cluster;
}

@Bean
public CassandraMappingContext mappingContext() {
return new BasicCassandraMappingContext();
}

@Bean
public CassandraConverter converter() {
return new MappingCassandraConverter(mappingContext());
}

@Bean
public CassandraSessionFactoryBean session() throws Exception {
CassandraSessionFactoryBean session = new CassandraSessionFactoryBean();
session.setCluster(cluster().getObject());
session.setKeyspaceName(cassandraKeySpace);
session.setConverter(converter());
session.setSchemaAction(SchemaAction.NONE);

return session;
}

@Bean
public CassandraOperations cassandraTemplate() throws Exception {
return new CassandraTemplate(session().getObject());
}

@Bean
public ConversionService getConversionService() {
ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean();
bean.setConverters(new HashSet<>(getConverters()));
bean.afterPropertiesSet();

return bean.getObject();
}

private Set<Converter<?, ?>> getConverters() {
Set<Converter<?, ?>> converters = new HashSet<>();
converters.addAll(Jsr310Converters.getConvertersToRegister());
converters.add(new DateTimeWriteConverter());
converters.add(new DateTimeReadConverter());

return converters;
}

public static class DateTimeWriteConverter implements Converter<DateTime, Long> {
@Override
public Long convert(DateTime source) {
return source.getMillis();
}
}

public static class DateTimeReadConverter implements Converter<Long, DateTime> {
@Override
public DateTime convert(Long source) {
return new DateTime(source);
}
}

}

最佳答案

Spring Cassandra 的自定义转换在您创建 CassandraCustomConversions bean 时起作用。只需添加您的自定义转换器,默认转换器将保留。下面是我的@Configuration 类。

@Bean
CassandraCustomConversions cassandraCustomConversions() {
List<Converter<?, ?>> converters = new ArrayList<>();
converters.add(new MyDataReadConverter());
return new CassandraCustomConversions(converters);
}

static class CounterDataReadConverter implements Converter<ByteBuffer, MyData> {
@Override
public MyData convert(ByteBuffer source) {
try {
return MyData.parseFrom(source.array());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

我正在使用基于 SpringBoot 2.0.0.RELEASE 的 spring-boot-starter-data-cassandra。

关于spring - 自定义 Cassandra 转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34786339/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com