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

问题描述

我具有如下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无法正常工作。

解决方法

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

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

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

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