2017-12-27 817 views
0

我有我想要映射到一列卡桑德拉卡桑德拉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) 

我到底做错了什么?

回答

3

EnumOrdinalCodec用于在int < - > Enum only之间映射。由于您的Enum基于字符串,因此请使用EnumNameCodec类。这两个编解码器类的Javadoc如下所示。希望能帮助到你。

EnumNameCodec

甲序列化枚举实例作为CQL VARCHAR处理表示由Enum.name作为返回 其程序名称编解码器()。

EnumOrdinalCodec

序列化枚举实例作为表示由Enum.ordinal作为返回其 序号值CQL整数A编码解码法()。

链接Javadoc

+0

谢谢!不能相信我错过了:) – AbtPst