簡體   English   中英

datastax cassandra java驅動程序問題與scala轉換(播放2.3.x)

[英]datastax cassandra java driver issue with scala conversions (play 2.3.x)

這全部發生在帶有scala模板的Play 2.3.x應用程序中

我正在使用此導入:

import com.datastax.driver.core.Row

與這個案例一起

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驅動程序正確創建其預期類型的​​Map,然后使用asInstanceOf將其強制轉換為Map [String] ,長]:

private def times(row: Row): timeOnPage =
  timeOnPage(row.getString("ip"), row.getMap("page", classOf[String], classOf[java.lang.Long]).toMap.asInstanceOf[Map[String,Long]])

此注釋提供了更多指導,例如創建用於從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]))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM