Проблема драйвера Java datastax cassandra с преобразованиями scala (игра 2.3.x)

Все это происходит в приложении Play 2.3.x с шаблоном scala.

Я использую этот импорт:

import com.datastax.driver.core.Row

Наряду с этим классом case

case class timeOnPage(ip: String, pages: Map[String, Long])

Я использую следующий код для создания экземпляров timeOnPage со строками cassandra:

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

Ни один из типов не проверяет.

Любое понимание этого? заранее спасибо


person plamb    schedule 13.01.2015    source источник


Ответы (1)


Это не красиво, но это приведет к тому, что ваша карта [String, java.lang.Long] будет преобразована в Map [String, Long], что позволит java-драйверу правильно создать карту ожидаемого типа, а затем принудительно заставит ее с помощью 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]))
person Andy Tolbert    schedule 14.01.2015