Привод Gson и весны

Я использую пружинный загрузчик и пружинный привод.
Мой проект широко использует JsonElement Gson и все внутренние методы возвращают JsonElements (которые могут быть JsonObject, JsonArray и т. д)

Поскольку JsonElement не является традиционным POJO, Джексон испытывает проблемы с сериализацией JsonElement.

Поэтому я настроил HttpMessageConvertor на использование Gson вместо Jackson. После этого все мои API привода (здоровье и т. д.), Кажется, испорчены, так как привод сильно зависит от аннотаций Джексона.

Все, что я хочу, это использовать 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 ответ

  1. Как я уже указывал ранее, проблема была явно из-за некоторых Примечаний Джексона, используемых в API привода. Spring рекомендует использовать Jackson для serailaisation json, поэтому при использовании gson это вызывает некоторые проблемы.

    Лучшее решение-написать пользовательские сериализаторы и десериализаторы для объектов Gson (JsonElement, JsonObject и т.д.), Чтобы Джексон мог соответствующим образом сериализовать и десериализовать jsons.

    Библиотека JsonMystique предоставляет эти пользовательские сериализаторы / десериализаторы из коробки.

    [Полное раскрытие] JSON Mystique-это библиотека, поддерживаемая мной

    Все, что вам нужно сделать, это

    1. включить зависимость jsonMystique
    2. Добавить JsonMystiqueConfig в сканирование компонентов
    3. Вот оно!!! Jsonmystique по умолчанию регистры модуль может сериализовать и десериализовать элементы Gson

    Теперь Джексон сможет сериализовать элементы Gson. Таким образом, приведенная ниже сигнатура метода для RestController является полностью допустимой

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

    PS: Если вы не хотите импортировать всю библиотеку, обратитесь к этому модулю, чтобы увидеть пользовательские десериализаторы