datastax cassandra java scala 转换的驱动程序问题(播放 2.3.x)
datastax cassandra java driver issue with scala conversions (play 2.3.x)
这一切都发生在 Play 2 中。3.x 带有 scala 模板的应用程序
我正在使用这个导入:
import com.datastax.driver.core.Row
伴随着这个案例class
case class timeOnPage(ip: String, pages: Map[String, Long])
我正在使用以下代码生成带有 cassandra 行的 timeOnPage 实例:
private def times(row: Row): timeOnPage =
timeOnPage(row.getString("ip"), row.getMap("page", classOf[String], classOf[Long]).toMap)
代码编译正常,但是当它是运行时,返回这个错误:
[InvalidTypeException: Column page is a map of class java.lang.String->class java.lang.Long (CQL type map<varchar, bigint>), cannot be retrieve as a map of class java.lang.String->long]
我尝试了几种不同的方式来声明 classOf[Long],例如:
classOf[java.lang.Long]
Class.forName("java.lang.Long")
都没有类型检查。
对此有何见解?提前谢谢你
它不是很漂亮,但是这会强制你的 Map[String,java.lang.Long] 变成 Map[String,Long] 允许 java-driver 正确地创建它预期类型的 Map 和然后使用 asInstanceOf 强制它进入 Map[String,Long]:
private def times(row: Row): timeOnPage =
timeOnPage(row.getString("ip"), row.getMap("page", classOf[String], classOf[java.lang.Long]).toMap.asInstanceOf[Map[String,Long]])
This comment 提供了一些更多的指导,例如创建隐式转换以从 Map[String, java.lang.Long] 转换为 Map[String, Long] 例如:
import scala.collection.JavaConverters._
implicit def convMap(in: java.util.Map[String, java.lang.Long]): Map[String, Long] =
in.asScala.toMap.mapValues(Long2long)
private def times(row: Row): timeOnPage =
timeOnPage(row.getString("ip"), row.getMap("page", classOf[String], classOf[java.lang.Long]))
这一切都发生在 Play 2 中。3.x 带有 scala 模板的应用程序
我正在使用这个导入:
import com.datastax.driver.core.Row
伴随着这个案例class
case class timeOnPage(ip: String, pages: Map[String, Long])
我正在使用以下代码生成带有 cassandra 行的 timeOnPage 实例:
private def times(row: Row): timeOnPage =
timeOnPage(row.getString("ip"), row.getMap("page", classOf[String], classOf[Long]).toMap)
代码编译正常,但是当它是运行时,返回这个错误:
[InvalidTypeException: Column page is a map of class java.lang.String->class java.lang.Long (CQL type map<varchar, bigint>), cannot be retrieve as a map of class java.lang.String->long]
我尝试了几种不同的方式来声明 classOf[Long],例如:
classOf[java.lang.Long]
Class.forName("java.lang.Long")
都没有类型检查。
对此有何见解?提前谢谢你
它不是很漂亮,但是这会强制你的 Map[String,java.lang.Long] 变成 Map[String,Long] 允许 java-driver 正确地创建它预期类型的 Map 和然后使用 asInstanceOf 强制它进入 Map[String,Long]:
private def times(row: Row): timeOnPage =
timeOnPage(row.getString("ip"), row.getMap("page", classOf[String], classOf[java.lang.Long]).toMap.asInstanceOf[Map[String,Long]])
This comment 提供了一些更多的指导,例如创建隐式转换以从 Map[String, java.lang.Long] 转换为 Map[String, Long] 例如:
import scala.collection.JavaConverters._
implicit def convMap(in: java.util.Map[String, java.lang.Long]): Map[String, Long] =
in.asScala.toMap.mapValues(Long2long)
private def times(row: Row): timeOnPage =
timeOnPage(row.getString("ip"), row.getMap("page", classOf[String], classOf[java.lang.Long]))