CodecNotFoundException:找不到请求的操作的编解码器:[日期<-> java.util.Date]

时间:2019-07-19 11:19:12

标签: cassandra datastax datastax-java-driver

我在Java8中使用以下datastax版本

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

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

我的表的日期列如下所示

cass_table (                                                    
    data_source_id int,                                                                                                                                                                   
    company_id text,                                                              
    create_date date)  

当我尝试将数据保存到C *表中时,如下所示

final IndustryCompany four = new IndustryCompany(1,1236, ProdUtils.today());
 industryCompanyRepository.save(one);


public static Date today() {
        return java.sql.Date.valueOf(new SimpleDateFormat(ProducerConstants.DATABASE_DATE_FORMAT).format(Calendar.getInstance().getTime()));
    }

遇到错误:

Caused by: com.datastax.driver.core.exceptions.CodecNotFoundException: Codec not found for requested operation: [date <-> java.sql.Date]
    at com.datastax.driver.core.exceptions.CodecNotFoundException.copy(CodecNotFoundException.java:57) ~[cassandra-driver-core-3.7.2.jar:na]

我在做什么错? 如何解决?任何帮助,请...

2 个答案:

答案 0 :(得分:1)

您需要改为传递com.datastax.driver.core.LocalDate类型的变量。有关Java类型和CQL类型之间的映射,请参见documentation。您可以使用JDK 8中的LocalDate,也可以使用Joda时间包中的optional codec

另一种可能性是write date <-> java.sql.Date并将其注册以进行直接映射。

答案 1 :(得分:0)

非常感谢@Alex Ott 正如您所建议的,我在下面做了

添加了另一个罐子

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

在调用save()方法之前,我已经调用了

public void registerCodecs() {
    CodecRegistry registry = this.session.getCluster().getConfiguration().getCodecRegistry();
    registry.register(LocalDateCodec.instance);
}