SalatDAO 没有正确反序列化 BasicDBList
SalatDAO does not deserialize BasicDBList properly
我有一个案例 class 是 JValue
类型的属性之一。
在序列化过程中,它被转换为 BasicDBList
(不管它的值是多少,即使它只是一个 JString
- 这很奇怪,但把它放在一边......)
因此将对象保存到数据库 (Mongodb) 工作正常,但是当我尝试 findOne()
时,出现以下错误:
argument type mismatch
$anon(class com.example.data.Telemetry @ com.novus.salat.global.package$$anon@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
)。这很好用,但是另一种方式似乎坏了。
我是不是漏掉了什么?
Salat 没有针对 org.json4s
classes 的特殊处理/转换。因为 JString
是一个案例 class,最终 Salat 委托给 Casbah 中的默认编码器将您的 JString
转换为 java.util.List
稍后,当 Salat 尝试从 DBObject 中提取它时,它同样没有任何将其从 DBList 转换为 JString 的逻辑。
如果您必须使用 JString
,我建议您考虑实施自定义转换器并将其注册到您的 Salat 上下文。这里的例子:
我有一个案例 class 是 JValue
类型的属性之一。
在序列化过程中,它被转换为 BasicDBList
(不管它的值是多少,即使它只是一个 JString
- 这很奇怪,但把它放在一边......)
因此将对象保存到数据库 (Mongodb) 工作正常,但是当我尝试 findOne()
时,出现以下错误:
argument type mismatch
$anon(class com.example.data.Telemetry @ com.novus.salat.global.package$$anon@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
)。这很好用,但是另一种方式似乎坏了。
我是不是漏掉了什么?
Salat 没有针对 org.json4s
classes 的特殊处理/转换。因为 JString
是一个案例 class,最终 Salat 委托给 Casbah 中的默认编码器将您的 JString
转换为 java.util.List
稍后,当 Salat 尝试从 DBObject 中提取它时,它同样没有任何将其从 DBList 转换为 JString 的逻辑。
如果您必须使用 JString
,我建议您考虑实施自定义转换器并将其注册到您的 Salat 上下文。这里的例子: