如何解决找不到请求的操作的编解码器:[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 举报,一经查实,本站将立刻删除。