7
votes

In Cassandra a column type is set to Date and in Model class type of field is set to java.util.Date with getters and setters. During com.datastax.driver.mapping.Mapper.save I get the following exception:

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)

Found the following during Google search:

DATE      <-> com.datastax.driver.core.LocalDate : use getDate()
2
Convert java.util.Date to LocalDate - Ashraful Islam
Cassandra Date field maps Java LocalDate, you need to convert Check this solution stackoverflow.com/a/27323328/2320144 - Ashraful Islam
to convert from Date to LocalDate, I'd need to change data type of filed in Model class to use its setter, right? - Vijay Nandwana
Yes, You need to Change your data type to LocalDate - Ashraful Islam
Actually, changing Date to LocalDate causes another issue. 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"]->com.test.model.DepTest["testDob"]) - Vijay Nandwana

2 Answers

6
votes

You must convert java.util.Date to com.datastax.driver.core.LocalDate

Example:

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

I was facing the same issue with using timestamp

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]

Starting with driver 4.0, the CQL type timestamp is not mapped to java.util.Date anymore, but to java.time.Instant. Using Instant worked for me.