【问题标题】:Problems converting collection types from scala to java将集合类型从 scala 转换为 java 的问题
【发布时间】:2012-04-18 09:37:06
【问题描述】:

我正在使用 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)

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

有没有办法解决这个问题?

谢谢。

【问题讨论】:

    标签: java scala cassandra hector


    【解决方案1】:

    编辑:

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

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

    原文:

    您可以使用 collections.JavaConverters 代替 collection.JavaConversion。

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

    【讨论】:

      【解决方案2】:

      我实际上是通过将列表初始化为 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()
      }
      

      【讨论】:

      • 如果你不使用map的结果,你应该使用foreach而不是map
      猜你喜欢
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多