【问题标题】:Codec not found for requested operation: [duration <-> java.time.Duration]未找到请求操作的编解码器:[duration <-> java.time.Duration]
【发布时间】:2019-09-30 14:12:14
【问题描述】:

有下表

  "CREATE TABLE IF NOT EXISTS user_preferences (" +
                        "    user_id text," +
                        "    my_duration duration," +
                        "    last_modified timestamp," +
                        "    primary key((id))" +
                        ");";

当试图坚持以下模型时

import com.datastax.driver.mapping.annotations.Column;
import com.datastax.driver.mapping.annotations.PartitionKey;
import com.datastax.driver.mapping.annotations.Table;
import java.time.Duration;

@Table(name = "user_preferences")
public class UserPreferences {

    @PartitionKey
    @Column(name = "user_id")
    private String userId;

    @Column(name = "my_duration")
    private Duration myDuration;

    @Column(name = "last_modified")
    private Date lastModified;
}

我得到这个编解码器未找到异常。

com.datastax.driver.core.exceptions.CodecNotFoundException: Codec not found for requested operation: [duration <-> java.time.Duration]
    at com.datastax.driver.core.exceptions.CodecNotFoundException.copy(CodecNotFoundException.java:57) ~[cassandra-driver-core-3.6.0.jar:na]
    at com.datastax.driver.core.exceptions.CodecNotFoundException.copy(CodecNotFoundException.java:25) ~[cassandra-driver-core-3.6.0.jar:na]
    at com.datastax.driver.mapping.DriverThrowables.propagateCause(DriverThrowables.java:39) ~[cassandra-driver-mapping-3.6.0.jar:na]
    at com.datastax.driver.mapping.Mapper.save(Mapper.java:356) ~[cassandra-driver-mapping-3.6.0.jar:na]

注意:读取工作正常可能是因为该表尚未填充。

Datastax-core 3.3.2 支持 java.time.Duration 吗?


【问题讨论】:

  • 请详细说明您的问题,以便人们可以帮助您。

标签: java cassandra datastax duration


【解决方案1】:

来自 cmets 的添加: 默认编解码器返回 com.datastax.driver.core.Duration! C* 持续时间与 java.time.Duration 不兼容。因此,您应该在代码中使用驱动程序 Duration 类型或提供您自己的编解码器。

这个特定问题的错误答案,但如果您要实现自己的编解码器仍然有用,您必须以这种方式注册它。

对于其他 java.time 类,您需要使用/注册额外的 jdk8 编解码器: https://docs.datastax.com/en/developer/java-driver/3.1/manual/custom_codecs/extras/

import com.datastax.driver.extras.codecs.jdk8.InstantCodec;
import java.time.Instant;

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

或者如果您无权访问集群对象

com.datastax.driver.core.CodecRegistry.DEFAULT_INSTANCE.register(InstantCodec.instance);

【讨论】:

  • com.datastax.driver.extras.codecs.jdk8 仅包含:InstantCodec LocalDateCodec LocalDateTimeCodec LocalTimeCodec OptionalCodec ZonedDateTimeCodec ZoneIdCodec
  • duration 好像是默认支持的,不需要添加额外的编解码器,但还是不行
  • 默认编解码器返回 com.datastax.driver.core.Duration!因为 C* 持续时间与 java.time.Duration 不兼容。所以你应该使用驱动程序 Duration 类型或提供你自己的编解码器。
猜你喜欢
  • 2017-03-24
  • 2017-02-16
  • 2019-05-27
  • 2017-04-07
  • 2018-06-08
  • 2018-01-06
  • 2017-09-25
  • 2017-05-19
  • 2021-01-29
相关资源
最近更新 更多