2

cassandra データストアにアクセスするために hector HOM ライブラリを使用しています。このライブラリは Java で記述されており、コレクションを操作する際に何らかのリフレクションを使用します。

取得したい文字列のリストを含む 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 タイプの処理方法を知らないように見えることです。

とにかくこれを回避する方法はありますか?

ありがとう。

4

2 に答える 2

0

map関数に新しいリストを作成させるのではなく、リストをjava.util.ArrayList [String]として初期化することで、実際に回避しました。

val thingList = new java.util.ArrayList[String]
things match {
  case Some(t) => t.map(s => thingList.add(s))
  case None => new java.util.ArrayList()
}
于 2012-04-04T19:07:58.780 に答える
0

編集:

申し訳ありません... scala.collection.JavaConversions$SeqWrapper の toString impl を誤解させると、同じ結果が返されます...

ただし、回避策として自分のリストから 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]
于 2012-04-04T17:22:38.283 に答える