我使用弹簧套和弹簧执行器。 我的项目广泛使用Gson的JsonElement,所有内部方法都返回JsonElements(可以是JsonObject,JsonArray等)
由于JsonElement不是传统的POJO,杰克逊在序列化JsonElement时遇到了麻烦。
所以我将HttpMessageConvertor配置为使用Gson而不是Jackson。在此之后,我的所有执行器apis(健康状况等)似乎都搞砸了,因为执行器在很大程度上依赖于杰克逊的注释。
我想要的只是将Gson仅用于JsonElement和Jackson用于所有其他对象。这可能吗?
如果没有,我如何确保Gson与执行器无缝协作?
Gson输出
{
"status": {
"code": "DOWN",
"description": ""
},
"details": {
"discoveryComposite": {
"status": {
"code": "UP",
"description": "Spring Cloud Consul Discovery Client"
},
"details": {
"discoveryClient": {
"status": {
"code": "UP",
"description": "Spring Cloud Consul Discovery Client"
},
"details": {
"services": [
"CM",
"CM-DITTO",
"consul",
"couchbase",
"rabbitmq"
]
}
}
}
}
}
}
杰克逊输出
{
"status": "DOWN",
"discoveryComposite": {
"description": "Spring Cloud Consul Discovery Client",
"status": "UP",
"discoveryClient": {
"description": "Spring Cloud Consul Discovery Client",
"status": "UP",
"services": [
"CM",
"CM-DITTO",
"consul",
"couchbase",
"rabbitmq"
]
}
}
}
答案 0 :(得分:0)
正如我之前所指出的,问题显然是因为执行器apis中使用了一些杰克逊注释。 Spring建议使用Jackson进行json serailaisation,因此当使用gson时会导致一些问题。
最好的解决方案是为Gson对象(JsonElement,JsonObject等)编写自定义序列化器和解串器,这样jackson可以适当地序列化和反序列化jsons。
JsonMystique库提供了开箱即用的自定义序列化程序/解串器。
[完全披露] Json Mystique是由我维护的图书馆
您需要做的就是
现在杰克逊将能够序列化Gson Elements。因此,RestController的以下方法签名是完全有效的
@RequestMapping(value = "query")
public DeferredResult<JsonElement> query(@RequestParam String host, @RequestBody JsonObject query) {
}
PS:如果您不想导入整个库,请参阅此module以查看自定义反序列化程序