1

我有一个案例类,它是 type 的属性之一JValue

在序列化期间,它被转换为BasicDBList(不管它的价值是什么,即使它只是一个JString- 这很奇怪,但把它放在一边......)

所以将对象保存到数据库(Mongodb)工作正常,但是当我尝试时findOne(),我收到以下错误:

argument type mismatch

          $anon$2(class com.example.data.Telemetry @ com.novus.salat.global.package$$anon$1@7376d6c3) toObject failed on:
          SYM: com.example.data.Telemetry
          CONSTRUCTOR
        public com.example.data.Telemetry(java.lang.String,org.json4s.JsonAST$JValue)

        ---------- CONSTRUCTOR EXPECTS FOR PARAM [1] --------------
        NAME:         location
        TYPE:         org.json4s.JsonAST$JValue
        DEFAULT ARG   [Missing, but unnecessary because input value was supplied]
        @Ignore       false
        ---------- CONSTRUCTOR INPUT ------------------------
        TYPE: com.mongodb.BasicDBList
        VALUE:
        [ [ [ "latitude" , [ 34.001]] , [ "longitude" , [ 32.511]]]]
        ------------------------------------------------------------

所以看起来对象没有正确反序列化(从BasicDBList返回到JValue)。这很好用,但另一种方式似乎坏了。

我错过了什么吗?

4

1 回答 1

1

Salat 没有针对org.json4s类的特殊处理/转换。因为JString是一个案例类,最终 Salat 委托给 Casbah 中的默认编码器将您转换JStringjava.util.List

https://github.com/mongodb/casbah/blob/9f3ebe8e389a9cf91cc6ce1591b3950898e895a7/casbah-commons/src/main/scala/conversions/ScalaConversions.scala#L361

后来,当 Salat 尝试从 DBObject 中提取它时,它同样没有任何将其从 DBList 转换为 JString 的逻辑。

如果您必须使用JString,我建议您考虑实现自定义转换器并将其注册到您的 Salat 上下文中。这里的例子:

https://github.com/novus/salat/blob/master/salat-core/src/test/scala/com/novus/salat/test/custom/model.scala

https://github.com/novus/salat/blob/master/salat-core/src/test/scala/com/novus/salat/test/CustomTransformerSpec.scala

于 2015-03-13T18:38:30.857 回答