微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

找不到请求的操作的编解码器:[UDT“ keyspace” .user_product_info<-> model.user.UserProductInfo]

如何解决找不到请求的操作的编解码器:[UDT“ keyspace” .user_product_info<-> model.user.UserProductInfo]

问题:

我正在使用 DataStax Java驱动程序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]

解决方法

您有2种解决此问题的方法:

  • 按照documentation中的说明为您的UDT实施自定义代码(我不想从中复制代码)。这是必需的,因为您使用的是核心API(session.execute
  • 切换为使用object mapper-您将直接使用对象,并加载和保存它们,等等。您已经开始使用@CqlName注释对象,但未使用它们是因为您需要设置预处理器以基于此注释生成代码。 (您也不需要为简单的字段名添加注释,例如names等。对于更复杂的名称,也可能不需要注释,因为对象映射器具有不同的命名翻译器,例如驼峰到蛇形案例等)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。