【问题标题】:Codec not found for requested operation: [date <-> java.util.Date]未找到请求操作的编解码器:[日期 <-> java.util.Date]
【发布时间】:2017-05-19 17:27:41
【问题描述】:

在 Cassandra 中,列类型设置为 Date,而在 Model 类中,字段类型设置为 java.util.Date,并带有 getter 和 setter。在com.datastax.driver.mapping.Mapper.save 期间,我收到以下异常:

Codec not found for requested operation: [date <-> java.util.Date]

Caused by: com.datastax.driver.core.exceptions.CodecNotFoundException: Codec not found for requested operation: [date <-> java.util.Date]
at com.datastax.driver.core.exceptions.CodecNotFoundException.copy(CodecNotFoundException.java:56)
at com.datastax.driver.core.exceptions.CodecNotFoundException.copy(CodecNotFoundException.java:25)
at com.datastax.driver.mapping.DriverThrowables.propagateCause(DriverThrowables.java:41)
at com.datastax.driver.mapping.Mapper.save(Mapper.java:272)

在 Google 搜索过程中发现以下内容:

DATE      <-> com.datastax.driver.core.LocalDate : use getDate()

【问题讨论】:

  • 将 java.util.Date 转换为 LocalDate
  • Cassandra Date 字段映射Java LocalDate,需要转换查看这个解决方案stackoverflow.com/a/27323328/2320144
  • 要从 Date 转换为 LocalDate,我需要更改 Model 类中的字段数据类型才能使用它的 setter,对吧?
  • 是的,您需要将数据类型更改为 LocalDate
  • 实际上,将 Date 更改为 LocalDate 会导致另一个问题。 Caused by: org.codehaus.jackson.map.JsonMappingException: Can not instantiate value of type [simple type, class java.time.LocalDate] from JSON String; no single-String constructor/factory method (through reference chain: com.test.model.User["testList"]-&gt;com.test.model.DepTest["testDob"])

标签: java cassandra


【解决方案1】:

您必须将 java.util.Date 转换为 com.datastax.driver.core.LocalDate

例子:

 LocalDate localDate = LocalDate.fromMillisSinceEpoch(date.getTime());

【讨论】:

  • 我使用的是 POJO 映射器,我将 date 字段定义为 com.datastax.driver.core.LocalDate 并且它有效!谢谢!
【解决方案2】:

我在使用时间戳时遇到了同样的问题

reactor.core.Exceptions$ErrorCallbackNotImplemented: com.datastax.oss.driver.api.core.type.codec.CodecNotFoundException: Codec not found for requested operation: [TIMESTAMP <-> java.util.Date]
Caused by: com.datastax.oss.driver.api.core.type.codec.CodecNotFoundException: Codec not found for requested operation: [TIMESTAMP <-> java.util.Date]
    at com.datastax.oss.driver.internal.core.type.codec.registry.CachingCodecRegistry.createCodec(CachingCodecRegistry.java:609) ~[java-driver-core-4.9.0.jar:na]
    at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry$1.load(DefaultCodecRegistry.java:95) ~[java-driver-core-4.9.0.jar:na]
    at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry$1.load(DefaultCodecRegistry.java:92) ~[java-driver-core-4.9.0.jar:na]

从驱动程序 4.0 开始,CQL 类型的时间戳不再映射到 java.util.Date,而是映射到 java.time.Instant。 使用 Instant 对我有用。

【讨论】:

    猜你喜欢
    • 2019-11-28
    • 2017-03-24
    • 2017-02-16
    • 2019-05-27
    • 2017-04-07
    • 2018-06-08
    • 2018-01-06
    • 2019-09-30
    • 2017-09-25
    相关资源
    最近更新 更多