Gson和Spring执行器

时间:2016-10-06 15:35:46

标签: spring spring-boot jackson gson spring-boot-actuator

我使用弹簧套和弹簧执行器。 我的项目广泛使用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"
      ]
    }
  }
}

1 个答案:

答案 0 :(得分:0)

正如我之前所指出的,问题显然是因为执行器apis中使用了一些杰克逊注释。 Spring建议使用Jackson进行json serailaisation,因此当使用gson时会导致一些问题。

最好的解决方案是为Gson对象(JsonElement,JsonObject等)编写自定义序列化器和解串器,这样jackson可以适当地序列化和反序列化jsons。

JsonMystique库提供了开箱即用的自定义序列化程序/解串器。

[完全披露] Json Mystique是由我维护的图书馆

您需要做的就是

  1. 包括jsonMystique dependency
  2. JsonMystiqueConfig添加到组件扫描
  3. 多数民众赞成! JsonMystique默认情况下注册module可以序列化和反序列化Gson Elements
  4. 现在杰克逊将能够序列化Gson Elements。因此,RestController的以下方法签名是完全有效的

    @RequestMapping(value = "query")
    public DeferredResult<JsonElement> query(@RequestParam String host, @RequestBody JsonObject query) {
    
    }
    

    PS:如果您不想导入整个库,请参阅此module以查看自定义反序列化程序