将集合类型从scala转换为java时出现问题

时间:2012-04-04 16:16:41

标签: java scala cassandra hector

我使用hector HOM库来访问我的cassandra数据存储区。这个库是用java编写的,在使用Collections时使用了一些反思。

我有一个java模型,其中包含我想要检索的字符串列表。不幸的是,我得到以下例外:

Execution exception [[HectorObjectMapperException: exception while instantiating Collection type, scala.collection.JavaConversions$SeqWrapper]]

Caused by: me.prettyprint.hom.cache.HectorObjectMapperException: exception while instantiating Collection type, scala.collection.JavaConversions$SeqWrapper
    at me.prettyprint.hom.CollectionMapperHelper.instantiateCollection(CollectionMapperHelper.java:87) ~[hector-object-mapper-3.0-02.jar:na]
    at me.prettyprint.hom.HectorObjectMapper.createObject(HectorObjectMapper.java:297) ~[hector-object-mapper-3.0-02.jar:na]
    at me.prettyprint.hom.HectorObjectMapper.getObject(HectorObjectMapper.java:105) ~[hector-object-mapper-3.0-02.jar:na]
    at me.prettyprint.hom.EntityManagerImpl.find(EntityManagerImpl.java:132) ~[hector-object-mapper-3.0-02.jar:na]
Caused by: java.lang.InstantiationException: scala.collection.JavaConversions$SeqWrapper
    at java.lang.Class.newInstance0(Class.java:340) ~[na:1.6.0_29]
    at java.lang.Class.newInstance(Class.java:308) ~[na:1.6.0_29]
    at me.prettyprint.hom.CollectionMapperHelper.instantiateCollection(CollectionMapperHelper.java:75) ~[hector-object-mapper-3.0-02.jar:na]
    at me.prettyprint.hom.HectorObjectMapper.createObject(HectorObjectMapper.java:297) ~[hector-object-mapper-3.0-02.jar:na]

我尝试过显式创建一个java.util.list对象,但它仍会导致同样的问题。这是我创建和保存模型的代码:

val geoModel = new GeoModel(geoRK)
val thingList: java.util.List[java.lang.String] = things match {
  case Some(t) => t.map(s => s.toString())
  case None => new java.util.ArrayList()
}
geoModel.setThings(thingList)
geoDAO.upsertModel(geoModel)

该模型持续存在,我可以在cassandra中看到它:

(column=things, value=scala.collection.JavaConversions$SeqWrapper:0, timestamp=1333555422145002)

问题是当检索对象时,Hector似乎不知道如何处理scala.collection类型。

无论如何都要绕过这个?

感谢。

2 个答案:

答案 0 :(得分:0)

编辑:

对不起......误导了scala.collection.JavaConversions的$ String impl $ SeqWrapper它返回相同的...

但是,您可以自己创建一个java.util.List作为解决方法。

原:

而不是collection.JavaConversion你可以使用collections.JavaConverters。

scala> import collection.JavaConverters._
import collection.JavaConverters._

scala> List(1,2,3).asJava
res1: java.util.List[Int] = [1, 2, 3]

答案 1 :(得分:0)

我实际上是通过将我的列表初始化为java.util.ArrayList [String]而不是让map函数创建新列表来解决它:

val thingList = new java.util.ArrayList[String]
things match {
  case Some(t) => t.map(s => thingList.add(s))
  case None => new java.util.ArrayList()
}