我有一个案例类,如果是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
)。这样做很好,但另一种方式似乎已经破裂了。
我错过了什么吗?
答案 0 :(得分:1)
Salat对org.json4s
课程没有特殊处理/转换。由于JString
是一个案例类,因此最终Salat委托Casbah中的默认编码器会将您的JString
转换为java.util.List
稍后,当Salat尝试从DBObject中提取它时,它同样没有任何逻辑可以将它从DBList转换为JString。
如果您必须使用JString
,我建议您考虑实施自定义转换器并将其与Salat上下文一起注册。这里的例子: