2016-10-06 2 views
0

스프링 부트 및 스프링 액추에이터를 사용하고 있습니다. JsonElement 전통적인 POJO하지 않습니다, 때문에 잭슨 문제 JsonElement을 serialising을 가지고Gson 및 스프링 액추에이터

내 프로젝트는 광범위하게 GSON의 JsonElement를 사용하고 모든 내부 방법 (중 등 된 JSONObject, JsonArray 될 수 있습니다) JsonElements을 반환합니다.

그래서 Jackson 대신 Gson을 사용하도록 HttpMessageConvertor를 구성했습니다. 그 후에 액추에이터가 잭슨 주석에 크게 의존하기 때문에 모든 액추에이터 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" 
     ] 
    } 
    } 
} 

답변

0

는 문제는 액츄에이터의 API에서 사용되는 일부 잭슨 주석의 명확했다. Spring은 json serailaisation을 위해 Jackson을 사용할 것을 권장하므로 gson이 사용될 때 몇 가지 문제가 발생합니다.

가장 좋은 해결책은 Gson 객체 (JsonElement, JsonObject 등)에 대한 사용자 지정 serialisers 및 deserialisers를 작성하여 jackson이 적절하게 serialize하고 deserialize 할 수 있도록하는 것입니다.

JsonMystique 라이브러리는 이러한 맞춤형 직렬/병렬 변환기를 즉시 제공합니다.

가 [전체 공개] JSON 미스틱은 당신이해야 할 모든

  1. 나를

    에 의해 유지되는 라이브러리는 dependency

  2. 구성 요소 검사에 JsonMystiqueConfig 추가
  3. 그게 전부를 jsonMystique을 포함! !! !! JsonMystique는 기본값으로 module 레지스터를 직렬화 및 병렬 변환 할 수 있습니다.

이제 jackson이 직렬 Gson 요소를 사용할 수 있습니다. 따라서, RestController에 대한 아래의 방법 서명은

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

} 

PS는 완전히 유효합니다 : 당신이 전체 라이브러리를 가져올 수없는 경우, 사용자 정의 deserialisers를 보려면이 module을 참조하시기 바랍니다