java - Cassandra CodecNotFoundException : Codec not found for requested operation

标签 java cassandra datastax cassandra-3.0

我有一个枚举字段,我想映射到 cassandra 中的一个列

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 之间的映射。由于您的 Enum 是基于字符串的,因此请改用 EnumNameCodec 类。这两个编解码器类的 Javadoc 如下所示。希望对您有所帮助。

枚举名称解码器

A codec that serializes Enum instances as CQL varchars representing their programmatic names as returned by Enum.name().

枚举顺序编解码器

A codec that serializes Enum instances as CQL ints representing their ordinal values as returned by Enum.ordinal().

链接到 Javadoc

关于java - Cassandra CodecNotFoundException : Codec not found for requested operation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47996457/

相关文章:

c++ - 运行 datastax 的 cpp-driver 示例时出错

java - 在字符串集合中查找相关部分

java - 如何将 TornadoFX 中的文本字段限制为仅数字

java - 当相应的 Stream 关​​闭时,Java FileChannel 锁是否关闭,或者我是否必须显式关闭它们?

Cassandra - 一致性顺序

kubernetes - 将Cassandra数据存储在其他分布式文件系统(例如MapR和hdfs)上是否可行?

java - 使 Sprite 移动,需要 Sprite 停留在他第一次移动的位置

Cassandra :找不到命令

Cassandra READ Where In 性能

java - cassandra从java代码更新表