Кодек не найден для запрошенной операции: [duration <-> java.time.Duration] - PullRequest
0 голосов
/ 13 мая 2019

с таблицей ниже

  "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]

ПРИМЕЧАНИЕ: чтение работает нормально, вероятно, потому что таблица еще не заполнена.

- это java.time. Продолжительность, поддерживаемая Datastax-core 3.3.2?


1 Ответ

1 голос
/ 13 мая 2019

Добавление из комментариев: Кодек по умолчанию возвращает 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...