将 LocalDateTime 转换为 Cassandra TIMESTAMP 时出现编解码器问题

Codec Issue while converting LocalDateTime to Cassandra TIMESTAMP

我有如下的 POJO 属性,

 @Column(name = "timeStamp")
 private LocalDateTime timeStamp;

此属性来自服务,需要保留格式。我正在从 Kafka 流式传输输入,需要存储在 Cassandra 中。

我正在使用 datastax API、

创建 table

CreateTable createTable = SchemaBuilder.createTable("sample31", "contactNew")
                    .ifNotExists()
                    .withColumn("timeStamp", DataTypes.TIMESTAMP);

当我执行作业时,遇到以下异常,

Codec not found for requested operation: [timestamp <-> java.time.LocalDateTime]

我尝试使用不同的数据类型,例如 DataTypes.DURATIONDataTypes.DATE 不工作。

对于 Java 驱动程序 3.x 你需要使用一个单独的包 - so-called “可选编解码器”包括一个额外的依赖:

<dependency>
  <groupId>com.datastax.cassandra</groupId>
  <artifactId>cassandra-driver-extras</artifactId>
  <version>driver-version</version>
</dependency>

对于 Java 8 中的 LocalDateTime 有一个 LocalDateTimeCodec (doc) 应该在创建集群对象时注册,如下所示:

import com.datastax.driver.extras.codecs.jdk8.LocalDateTimeCodec;

cluster.getConfiguration().getCodecRegistry()
    .register(LocalDateTimeCodec.instance);

从驱动程序 4.8 开始,Java 驱动程序 4.x 也有类似的编解码器。也只需将必要的编解码器注册为 described in documentation。但最简单的方法是在会话构建时使用如下内容注册所有必要的编解码器:

CqlSession session = CqlSession.builder().addTypeCodecs()....build();

只需将其转换为 Instant 即可自动映射:

message.getLocalDateTime().toInstant(ZoneOffset.UTC)