You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:34:43