Кодек не найден для запрошенной операции: [UDT(«keyspace».user_product_info) model.user.UserProductInfo]

#java #database #spring-boot #cassandra #datastax

#java #База данных #весенняя загрузка #кассандра #datastax

Вопрос:

Проблема :

Я использую драйвер Java DataStax 4.9. Я объявил UDT user_product_info в моем пространстве ключей, и при этом используются вложенные UDT …… при запуске программы кодек отображается не найден при выполнении следующей строки

**

 PreparedStatement preparedUpdateFriendRating = session.prepare("UPDATE friend_rating SET user_product_infos=:userproductinfos WHERE user_id=:userId ;");
preparedUpdateFriendRating.bind(new ArrayList(userProductInfo), id);
  

**

ниже приведен файл shema.cql

 CREATE TYPE IF NOT exists user_product_info (id text,short_product frozen < short_product>,test set < text >,ratings list< frozen < rating > >);

CREATE TABLE IF NOT exists friend_rating(user_id text,user_product_infos list < frozen < user_product_info >>,PRIMARY KEY (user_id));

CREATE TYPE IF NOT exists short_product (name text,specs SET < text >,img text);
  

С соответствующим классом java

 //------------------------------------USER PRODUCT INFO-----------


@SchemaHint(targetElement = UDT)
public class UserProductInfo {

    @CqlName("id")
    private String productId;

    @CqlName("short_product")
    private ShortProduct shortProduct;

    @CqlName("test")
    private Set<String> test;

    @CqlName("ratings")
    private List<Rating> ratings;

    public UserProductInfo() {}

//with getters and setters
}

//---------------------------------------SHORT PRODUCT----------------

@SchemaHint(targetElement = UDT)
public class ShortProduct {
    @CqlName("name")
    private String name;

    @CqlName("specs")
    private Set<String> specs;

    @CqlName("img")
    private String imageUrl;

    public ShortProduct() {}
//with getters and setters
}

//--------------------------------------FRIEND RATING TABLE-------------------

@SchemaHint(targetElement = TABLE)
public class FriendRating {
    @PartitionKey
    @CqlName("user_id")
    private String userId;

    @CqlName("user_product_infos")
    private List<UserProductInfo> userProductInfos;

//with getters and setters
}
'''
  

со следующей трассировкой стека:

 com.datastax.oss.driver.api.core.type.codec.CodecNotFoundException: Codec not found for requested operation: [UDT("keyspace".user_product_info) <-> model.user.UserProductInfo]
    at com.datastax.oss.driver.internal.core.type.codec.registry.CachingCodecRegistry.createCodec(CachingCodecRegistry.java:609) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry$1.load(DefaultCodecRegistry.java:95) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry$1.load(DefaultCodecRegistry.java:92) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3527) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2276) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2154) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.get(LocalCache.java:2044) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache.get(LocalCache.java:3951) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache.getOrLoad(LocalCache.java:3973) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4957) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4963) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry.getCachedCodec(DefaultCodecRegistry.java:117) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.internal.core.type.codec.registry.CachingCodecRegistry.codecFor(CachingCodecRegistry.java:196) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.internal.core.type.codec.registry.CachingCodecRegistry.createCodec(CachingCodecRegistry.java:567) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry$1.load(DefaultCodecRegistry.java:95) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry$1.load(DefaultCodecRegistry.java:92) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3527) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2276) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2154) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$Segment.get(LocalCache.java:2044) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache.get(LocalCache.java:3951) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache.getOrLoad(LocalCache.java:3973) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4957) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.shaded.guava.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4963) ~[java-driver-shaded-guava-25.1-jre.jar:na]
    at com.datastax.oss.driver.internal.core.type.codec.registry.DefaultCodecRegistry.getCachedCodec(DefaultCodecRegistry.java:117) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.internal.core.type.codec.registry.CachingCodecRegistry.codecFor(CachingCodecRegistry.java:258) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.internal.core.data.ValuesHelper.encodePreparedValues(ValuesHelper.java:112) ~[java-driver-core-4.6.1.jar:na]
    at com.datastax.oss.driver.internal.core.cql.DefaultPreparedStatement.bind(DefaultPreparedStatement.java:159) ~[java-driver-core-4.6.1.jar:na]
  

Ответ №1:

У вас есть 2 альтернативы для решения этой проблемы:

  • Реализуйте пользовательский код для вашего UDT, как описано в документации (я не хочу копировать код из него). Это требуется, потому что вы используете core API ( session.execute )
  • Переключитесь на использование object mapper — вы будете работать с вашими объектами напрямую, загружая и сохраняя их и т. Д.. Вы уже начали аннотировать свои объекты @CqlName , но они не используются, потому что вам нужно настроить препроцессор для генерации кода на основе этих аннотаций. (вам также не нужно иметь аннотации для простых имен полей, таких как, names , и т.д. Вам также может не понадобиться это для более сложных имен, потому что object mapper имеет разные переводчики имен, например, регистр верблюда в регистр змеи и т.д.)