卡桑德拉CodecNotFoundException:编解码器找不到请求的操作
我有我想要映射到一列卡桑德拉卡桑德拉CodecNotFoundException:编解码器找不到请求的操作
public enum MyEnum { Aa,
Bb,
Cc,
}
一个枚举领域,这是我如何注册它
CodecRegistry myCodecRegistry = new CodecRegistry(); myCodecRegistry.register(new EnumOrdinalCodec<MyEnum>(MyEnum.class));
cluster = Cluster.builder().addContactPoint(cassandraHosts).withPort(cassandraPort).withCodecRegistry(myCodecRegistry).build();
我是能够连接到cassandra就好了。下面是模型类
public class MyModel {
@PartitionKey
@Column(name="id")
private String id;
@ClusteringColumn
@Column(name="name")
private String name = "";
@Column(name="enum")
private MyEnum enum;
public MyModel(String i, String n)
{
id=i;
name=n
enum=MyEnum.Aa;
}
}
的片段,这里是我如何创建使用CQL
CREATE TABLE IF NOT EXISTS tab
(
name varchar ,
id varchar,
enum varchar,
PRIMARY KEY ((id), name));
最后,我有我的映射代码
manager = new MappingManager(session); mapper = manager.mapper(MyModel.class);
accessor = manager.createAccessor(MyAccessor.class);
这里是表MyAccessor
@Accessor public interface MyAccessor{
@Query("SELECT * FROM case WHERE id=? and name=? ALLOW FILTERING;")
MyModel readByIdAndName(String id,String name);
}
所以当我尝试执行
MyModel m = new MyModel("asdasf","qw"); mapper.save(m);
我得到
com.datastax.driver.core.exceptions.CodecNotFoundException: Codec not found for requested operation: [varchar <-> my.pack.MyEnum] 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:289)
我到底做错了什么?
回答:
EnumOrdinalCodec用于在int < - > Enum only之间映射。由于您的Enum基于字符串,因此请使用EnumNameCodec
类。这两个编解码器类的Javadoc如下所示。希望能帮助到你。
EnumNameCodec
甲序列化枚举实例作为CQL VARCHAR处理表示由Enum.name作为返回 其程序名称编解码器()。
EnumOrdinalCodec
序列化枚举实例作为表示由Enum.ordinal作为返回其 序号值CQL整数A编码解码法()。
链接Javadoc
以上是 卡桑德拉CodecNotFoundException:编解码器找不到请求的操作 的全部内容, 来源链接: utcz.com/qa/266703.html