Gson 和 Spring 执行器
Gson and Spring Actuator
我正在使用 spring 引导和 spring 执行器。
我的项目广泛使用 Gson 的 JsonElement 和所有内部方法 return JsonElements(可以是 JsonObject、JsonArray 等)
由于 JsonElement 不是传统的 POJO,Jackson 在序列化 JsonElement 时遇到了麻烦。
所以我将 HttpMessageConvertor 配置为使用 Gson 而不是 Jackson。在此之后,我所有的执行器 api(健康等)似乎都搞砸了,因为执行器严重依赖 Jackson 注释。
我只想将 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"
]
}
}
}
正如我之前指出的,问题显然是由于执行器 api 中使用了一些 Jackson 注释。 Spring 建议使用 Jackson 进行 json 序列化,因此当使用 gson 时会导致一些问题。
最好的解决方案是为 Gson 对象(JsonElement、JsonObject 等)编写自定义序列化器和反序列化器,这样 jackson 就可以适当地序列化和反序列化 jsons。
JsonMystique 库提供这些自定义 serialisers/deserialisers 开箱即用。
[完全公开] Json Mystique 是我维护的库
您只需
- 包括 jsonMystique dependency
- 添加JsonMystiqueConfig到组件扫描
- 就是这样!!! JsonMystique 默认注册一个module 可以序列化和反序列化 Gson 元素
现在 jackson 将能够序列化 Gson Elements。因此,下面的 RestController 方法签名是完全有效的
@RequestMapping(value = "query")
public DeferredResult<JsonElement> query(@RequestParam String host, @RequestBody JsonObject query) {
}
PS : 如果您不想导入整个库,请参考此 module 以查看自定义解串器
我正在使用 spring 引导和 spring 执行器。 我的项目广泛使用 Gson 的 JsonElement 和所有内部方法 return JsonElements(可以是 JsonObject、JsonArray 等)
由于 JsonElement 不是传统的 POJO,Jackson 在序列化 JsonElement 时遇到了麻烦。
所以我将 HttpMessageConvertor 配置为使用 Gson 而不是 Jackson。在此之后,我所有的执行器 api(健康等)似乎都搞砸了,因为执行器严重依赖 Jackson 注释。
我只想将 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"
]
}
}
}
正如我之前指出的,问题显然是由于执行器 api 中使用了一些 Jackson 注释。 Spring 建议使用 Jackson 进行 json 序列化,因此当使用 gson 时会导致一些问题。
最好的解决方案是为 Gson 对象(JsonElement、JsonObject 等)编写自定义序列化器和反序列化器,这样 jackson 就可以适当地序列化和反序列化 jsons。
JsonMystique 库提供这些自定义 serialisers/deserialisers 开箱即用。
[完全公开] Json Mystique 是我维护的库
您只需
- 包括 jsonMystique dependency
- 添加JsonMystiqueConfig到组件扫描
- 就是这样!!! JsonMystique 默认注册一个module 可以序列化和反序列化 Gson 元素
现在 jackson 将能够序列化 Gson Elements。因此,下面的 RestController 方法签名是完全有效的
@RequestMapping(value = "query")
public DeferredResult<JsonElement> query(@RequestParam String host, @RequestBody JsonObject query) {
}
PS : 如果您不想导入整个库,请参考此 module 以查看自定义解串器