com.datastax.driver.core.exceptions.CodecNotFoundException:找不到请求操作的编解码器:[int< - > java.lang.Long中]

时间:2017-04-27 12:10:01

标签: scala cassandra phantom-dsl

写了这个简单的Phantom DSL代码

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

我收到错误

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

最令人困惑的是,如果你看一下上面的代码,这里绝对没有Int。

根据堆栈跟踪错误发生在

et(r),

1 个答案:

答案 0 :(得分:2)

我唯一能想到的是你的Cassandra架构不是用幻像创建的,而且在你的数据库中,列的类型与幻像推断为有效的不同。

幻像中的longdatetime列都会在Cassandra中转换为bigint类型,因此您需要确保数据库中的架构与之匹配。听起来像我的一个数据库列是int而不是long,因此当驱动程序尝试解析记录时,它会爆炸。这也意味着你没有使用自动模式生成,幻像可以开箱即用。请阅读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
     )

   }
}