com.datastax.driver.core.exceptions.CodecNotFoundException:编解码器找不到请求的操作:[诠释<-> java.lang.Long中]
问题描述:
写这个简单的幻象DSL代码com.datastax.driver.core.exceptions.CodecNotFoundException:编解码器找不到请求的操作:[诠释<-> 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)
}
我得到一个错误
[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)
最令人困惑的事情是,如果你看一下上面的代码,这里绝对没有任何地方诠释。
为每stacktrack错误是在该行
et(r),
答
我能想到的唯一的事情是,你的卡珊德拉架构未带幻象创建产生,并在您的数据库类型列的不同从幻影推断是有效的。
在幻影都long
和datetime
列会转换到卡桑德拉bigint
类型,所以你需要确保你的DB模式匹配。这听起来像你的数据库列之一是int
,而不是long
,所以当司机试图解析记录它炸了。这也意味着您没有使用自动模式生成功能,而幻像可以直接使用。阅读this了解更多详情。
此外,在主题方面,在更新的幻像版本中,fromRow
和put
方法都是宏派生的,所以您实际上不需要手动输入它们。所以在幻影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
)
}
}
它期望int为某列,并且您传递Long值。检查你传递的值是多少。 – SnehaT
哦,买什么它是否期待一个整数,当没有int int ... –