2017-12-27 57 views
0

찾을 수 없습니다 내가이카산드라 CodecNotFoundException : 코덱 내가 여기 내가 카산드라</p> <pre><code>public enum MyEnum { Aa, Bb, Cc, } </code></pre> <p>을의 열에 매핑 할 열거 필드가하고 요청 된 작업

CodecRegistry myCodecRegistry = new CodecRegistry(); 
      myCodecRegistry.register(new EnumOrdinalCodec<MyEnum>(MyEnum.class)); 

      cluster = Cluster.builder().addContactPoint(cassandraHosts).withPort(cassandraPort).withCodecRegistry(myCodecRegistry).build(); 

내가 등록하는 방법입니다 카산드라에 연결할 수 있습니다. 여기에 모델 클래스

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; 
    } 
} 

을의 조각이며 여기에 내가

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); 

가 여기에있다 CQL

를 사용하여 테이블을 생성하는 방법이다 MyAccessor

@Accessor 
public interface MyAccessor{ 

    @Query("SELECT * FROM case WHERE id=? and name=? ALLOW FILTERING;") 
    MyModel readByIdAndName(String id,String name); 
} 

그래서 난 내가 뭘 잘못

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) 

을 얻을

MyModel m = new MyModel("asdasf","qw"); 
mapper.save(m); 

실행하려고 할 때?

답변

3

EnumOrdinalCodec은 < -> 열거 형 사이에서만 매핑하는 데 사용됩니다. 열거 형은 문자열을 기반으로하므로 대신 EnumNameCodec 클래스를 사용하십시오. 이 두 코덱 클래스에 대한 Javadoc은 다음과 같습니다. 희망이 도움이됩니다. Enum.name 의해 반환 CQL 가 그들의 프로그램 이름이 나타내는 바와 같이 열거 된 varchar 인스턴스를 직렬화

EnumNameCodec

코덱().

EnumOrdinalCodec Enum.ordinal 의해 반환 그들의 순서를 나타내는 값에 CQL의 int로서 열거 인스턴스를 직렬화

코덱().

링크

+0

Javadoc에 감사합니다! 위선적 인 말투는 내가 그것을 놓쳤다 고 생각한다 :) – AbtPst