2017-04-27 3 views
0

は、この単純なファントムDSLコードcom.datastax.driver.core.exceptions.CodecNotFoundException:要求された操作が見つかりませんコーデック:私は挿入しようとするときは、[INT <->がjava.lang.Long]

case class FooRow(id: Long, dt: DateTime, et: Long, rid: Option[Long], d: Option[String] = None) 
class FooTable extends CassandraTable[FooTable, FooRow] { 
    object id extends LongColumn(this) with PartitionKey[Long] 
    object dt extends DateTimeColumn(this) with PartitionKey[DateTime] 
    object et extends LongColumn(this) with PartitionKey[Long] 
    object rid extends OptionalLongColumn(this) 
    object d extends OptionalStringColumn(this) 
    override def fromRow(r: Row): FooRow = { 
     FooRow(
     id(r), 
     dt(r), 
     et(r), 
     rid(r), 
     d(r) 
    ) 
    } 
} 

を書きました行。このコード

def put(data: FooRow) : ResultSet = { 
     val query = insert 
     .value(_.id, data.id) 
     .value(_.dt, data.dt) 
     .value(_.rid, data.rid) 
     .value(_.d, data.d) 
     .value(_.et, data.et) 
     query.consistencyLevel_=(ConsistencyLevel.QUORUM) 
     Await.result(query.future(), awaitConfiguration.awaitTimeoutValue seconds) 
    } 

を使用して、私はほとんどの混乱の事は、あなたが上記のコードを見れば、ここではどこにも全くのIntではないということであるエラー

[info] - should be able to retrieve all history records by respondent id *** FAILED *** 
[info] com.datastax.driver.core.exceptions.CodecNotFoundException: Codec not found for requested operation: [int <-> java.lang.Long] 
[info] at com.datastax.driver.core.CodecRegistry.notFound(CodecRegistry.java:679) 
[info] at com.datastax.driver.core.CodecRegistry.createCodec(CodecRegistry.java:526) 
[info] at com.datastax.driver.core.CodecRegistry.findCodec(CodecRegistry.java:506) 
[info] at com.datastax.driver.core.CodecRegistry.access$200(CodecRegistry.java:140) 
[info] at com.datastax.driver.core.CodecRegistry$TypeCodecCacheLoader.load(CodecRegistry.java:211) 
[info] at com.datastax.driver.core.CodecRegistry$TypeCodecCacheLoader.load(CodecRegistry.java:208) 
[info] at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3542) 
[info] at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2323) 
[info] at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2286) 
[info] at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2201) 
[info] at com.google.common.cache.LocalCache.get(LocalCache.java:3953) 
[info] at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3957) 
[info] at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4875) 
[info] at com.datastax.driver.core.CodecRegistry.lookupCodec(CodecRegistry.java:480) 
[info] at com.datastax.driver.core.CodecRegistry.codecFor(CodecRegistry.java:448) 
[info] at com.datastax.driver.core.CodecRegistry.codecFor(CodecRegistry.java:430) 
[info] at com.datastax.driver.core.AbstractGettableByIndexData.codecFor(AbstractGettableByIndexData.java:69) 
[info] at com.datastax.driver.core.AbstractGettableByIndexData.getLong(AbstractGettableByIndexData.java:152) 
[info] at com.datastax.driver.core.AbstractGettableData.getLong(AbstractGettableData.java:26) 
[info] at com.datastax.driver.core.AbstractGettableData.getLong(AbstractGettableData.java:95) 
[info] at com.websudos.phantom.builder.primitives.DefaultPrimitives$LongPrimitive$$anonfun$fromRow$7.apply(Primitive.scala:187) 
[info] at com.websudos.phantom.builder.primitives.DefaultPrimitives$LongPrimitive$$anonfun$fromRow$7.apply(Primitive.scala:187) 
[info] at com.websudos.phantom.builder.primitives.Primitive$$anonfun$nullCheck$1.apply(Primitive.scala:69) 
[info] at scala.util.Try$.apply(Try.scala:192) 
[info] at com.websudos.phantom.builder.primitives.Primitive.nullCheck(Primitive.scala:69) 
[info] at com.websudos.phantom.builder.primitives.DefaultPrimitives$LongPrimitive$.fromRow(Primitive.scala:187) 
[info] at com.websudos.phantom.column.PrimitiveColumn.optional(PrimitiveColumn.scala:52) 
[info] at com.websudos.phantom.column.Column.apply(Column.scala:42) 
[info] at com.abhi.FooTable.fromRow(FooService.scala:27) 

を取得します。

エラーがライン

et(r), 
+0

これは、一部の列でintを期待していて、Long値を渡しています。長い値を渡すものを確認してください。 – SnehaT

+0

オハイオ州を購入WHYはintがないときにintを期待しています... –

答えて

2

で発生しているstacktrackあたりのように私は考えることができる唯一のことは、あなたのカサンドラのスキーマがファントムを使用して作成されていなかったということであり、そのあなたのDBの列の型が異なりますファントムが有効であると推測するものから。ファントムで

両方longdatetime列はカサンドラでbigint型に変換されますので、あなたのDBのスキーマが一致することを確認する必要があります。 DB列の1つがlongの代わりにintであるように私に聞こえるので、ドライバがレコードを解析しようとすると、それは爆発します。これはまた、自動化されたスキーマ生成を使用しないことを意味します。詳細はthisをご覧ください。

また、最新のバージョンのファントムでは、fromRowputの両方のメソッドがマクロ派生であるため、実際に手動で入力する必要はありません。だから2.7.3では、あなたのコードは次のようになります:

import com.outworkers.phantom.dsl._ 

case class FooRow(
    id: Long, 
    dt: DateTime, 
    et: Long, 
    rid: Option[Long], 
    d: Option[String] = None 
) 

abstract class FooTable extends CassandraTable[FooTable, FooRow] with RootConnector { 
    object id extends LongColumn(this) with PartitionKey 
    object dt extends DateTimeColumn(this) with PartitionKey 
    object et extends LongColumn(this) with PartitionKey 
    object rid extends OptionalLongColumn(this) 
    object d extends OptionalStringColumn(this) 

    def put(data: FooRow): ResultSet = { 

    Await.result(
     store(data).consistencyLevel_=(ConsistencyLevel.QUORUM).future(), 
     awaitConfiguration.awaitTimeoutValue seconds 
    ) 

    } 
} 
関連する問題