如何在Spring配置中实现java.time.LocalDate转Datastax LocalDate的Cassandra转换器
Spring Data Cassandra LocalDate类型自动转换实现方案
你可以通过自定义Spring转换器并注册到Cassandra全局转换规则来实现需求,这是官方推荐的最优实现方案,全程不需要修改业务代码,全局自动生效:
步骤1:实现自定义类型转换器
分别实现两种LocalDate格式互转的转换器,兼顾读写场景的适配:
import org.springframework.core.convert.converter.Converter; import java.time.LocalDate; // JDK自带LocalDate转Datastax驱动LocalDate public class JdkLocalDateToDatastaxLocalDateConverter implements Converter<LocalDate, com.datastax.driver.core.LocalDate> { @Override public com.datastax.driver.core.LocalDate convert(LocalDate source) { return com.datastax.driver.core.LocalDate.fromYearMonthDay( source.getYear(), source.getMonthValue(), source.getDayOfMonth() ); } } // Datastax驱动LocalDate转JDK自带LocalDate(可选,建议加上适配写入场景) public class DatastaxLocalDateToJdkLocalDateConverter implements Converter<com.datastax.driver.core.LocalDate, LocalDate> { @Override public LocalDate convert(com.datastax.driver.core.LocalDate source) { return LocalDate.of( source.getYear(), source.getMonth(), source.getDay() ); } }
步骤2:在配置类中注册转换器
在你的Cassandra配置类中声明CassandraCustomConversions Bean,将上面自定义的转换器加入转换列表即可:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.cassandra.config.AbstractCassandraConfiguration; import org.springframework.data.cassandra.core.convert.CassandraCustomConversions; import java.util.Arrays; @Configuration public class CassandraConfig extends AbstractCassandraConfiguration { // 省略其他必填配置:keyspace名称、集群连接地址、端口等 @Bean @Override public CassandraCustomConversions customConversions() { return new CassandraCustomConversions(Arrays.asList( new JdkLocalDateToDatastaxLocalDateConverter(), new DatastaxLocalDateToJdkLocalDateConverter() )); } }
额外说明
- 如果你没有继承
AbstractCassandraConfiguration,直接在配置类中单独注册CassandraCustomConversionsBean即可,Spring会自动将其加载到Cassandra的转换上下文 - 如果你的Spring Data Cassandra版本 >= 3.0,对应使用的是Datastax OSS Driver 4.x,驱动的LocalDate包名变更为
com.datastax.oss.driver.api.core.type.codec.LocalDate,只需要调整转换器中的目标类型即可适配 - 该转换规则全局生效,所有实体映射、查询返回的相关类型转换都会自动处理,不需要对业务代码做任何修改
内容的提问来源于stack exchange,提问作者stackmj18
相关产品推荐
相关产品推荐

