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

Posted

技术标签:

【中文标题】将 LocalDateTime 转换为 Cassandra TIMESTAMP 时的编解码器问题【英文标题】:Codec Issue while converting LocalDateTime to Cassandra TIMESTAMP 【发布时间】:2020-12-03 06:24:19 【问题描述】:

我有如下 POJO 属性,

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

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

我正在使用 datastax API 创建表,


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

当我的工作执行时,我面临以下异常,

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

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

【问题讨论】:

【参考方案1】:

对于 Java 驱动程序 3.x,您需要通过包含附加依赖项来使用单独的包 - 所谓的“可选编解码器”:

<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();

【讨论】:

@alek 我使用CqlSession session = CqlSession.builder() 实例来执行我​​的查询。上面有没有办法注册?

以上是关于将 LocalDateTime 转换为 Cassandra TIMESTAMP 时的编解码器问题的主要内容,如果未能解决你的问题,请参考以下文章

将 LocalDate 转换为 LocalDateTime 或 java.sql.Timestamp

在时区将 ZonedDateTime 转换为 LocalDateTime

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

Scala,使用 play 2.5 将 joda.LocalDateTime 转换为 json

无法将 java.lang.String 类型的属性值转换为所需的 java.time.LocalDateTime 类型

如何在不将 LocalDateTime 字段转换为扩展的 json 对象的情况下将 java 对象转换为简单的 json 字符串?