Spring Boot Starter Cassandra缺失CassandraCustomConversions,需添加日期转时间戳转换器
解决方案:自定义Cassandra Date转Timestamp转换器
其实Spring Boot Starter Cassandra是完全支持自定义类型转换器的,只是需要我们手动实现并注册配置,我来给你一步步拆解操作:
1. 实现自定义转换器类
首先创建一个类,实现Spring Data的Converter<S, T>接口,专门处理Date到Timestamp的转换逻辑:
import org.springframework.core.convert.converter.Converter; import java.util.Date; import java.sql.Timestamp; public class DateToTimestampConverter implements Converter<Date, Timestamp> { @Override public Timestamp convert(Date source) { if (source == null) { return null; } return new Timestamp(source.getTime()); } }
如果之后需要反向转换(从Cassandra的Timestamp转回Java的Date),可以再补充一个对应的转换器:
import org.springframework.core.convert.converter.Converter; import java.util.Date; import java.sql.Timestamp; public class TimestampToDateConverter implements Converter<Timestamp, Date> { @Override public Date convert(Timestamp source) { if (source == null) { return null; } return new Date(source.getTime()); } }
2. 注册转换器到Cassandra配置
接下来需要把自定义转换器接入Spring的Cassandra配置体系,有两种常用方式:
方式一:继承AbstractCassandraConfiguration
创建配置类继承官方的配置基类,并重写方法添加转换器:
import org.springframework.context.annotation.Configuration; import org.springframework.data.cassandra.config.AbstractCassandraConfiguration; import org.springframework.data.cassandra.config.SchemaAction; import org.springframework.data.cassandra.core.convert.CassandraCustomConversions; import java.util.Arrays; @Configuration public class CassandraConfig extends AbstractCassandraConfiguration { // 替换成你的Cassandra keyspace名称 @Override protected String getKeyspaceName() { return "your_target_keyspace"; } // 注册自定义转换器集合 @Override public CassandraCustomConversions customConversions() { return new CassandraCustomConversions(Arrays.asList( new DateToTimestampConverter(), new TimestampToDateConverter() // 不需要双向转换可以删掉这行 )); } // 可选:设置表结构的自动创建策略 @Override public SchemaAction getSchemaAction() { return SchemaAction.CREATE_IF_NOT_EXISTS; } }
方式二:直接定义CassandraCustomConversions Bean
如果不想继承完整配置类,也可以单独定义转换器Bean:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.cassandra.core.convert.CassandraCustomConversions; import java.util.Arrays; @Configuration public class CassandraConverterConfig { @Bean public CassandraCustomConversions cassandraCustomConversions() { return new CassandraCustomConversions(Arrays.asList( new DateToTimestampConverter(), new TimestampToDateConverter() )); } }
3. 验证使用
配置完成后,当你在实体类中使用Date类型字段时,Spring Data Cassandra会自动调用转换器,将其转为Cassandra的Timestamp类型存储:
import org.springframework.data.cassandra.core.mapping.Column; import org.springframework.data.cassandra.core.mapping.PrimaryKey; import org.springframework.data.cassandra.core.mapping.Table; import java.util.Date; @Table("user_logs") public class UserLog { @PrimaryKey private String logId; @Column("create_time") private Date createTime; // getter、setter省略 }
注意事项
- 转换器的泛型类型要准确匹配,Spring会自动根据源类型和目标类型匹配对应的转换器
- 若仅需要单向转换(比如只存不读时的Date转Timestamp),只注册对应方向的转换器即可
- 新版本Spring Data Cassandra(3.x+)的API细节略有调整,但核心注册逻辑保持一致
内容的提问来源于stack exchange,提问作者Sebastian G.
相关产品推荐
相关产品推荐

