Я вызываю конечную точку, которая возвращает JSON, которая выглядит примерно так (в Postman):
{
"Result": {
"attribute1": { ... },
"attribute2": { ... }
}
}
Заголовок Content-Type, возвращаемый этим запросом, равен text/x-json
(в отличие от обычного application/json
). Я думаю, что это вызывает некоторые проблемы при попытке десериализации этого через Джексона. POJO для этого JSON выглядит примерно так:
@Getter
@Setter
public class Response {
@JsonProperty("Result")
private Result result;
}
Класс Result
из внешней библиотеки (те же самые ребята, которые написали эту конечную точку). В любом случае, когда я пытаюсь вызвать эту конечную точку через RestTemplate.exchange()
, Джексон не может десериализовать этот JSON в допустимый класс Result
. Я делаю это:
ResponseEntity<Response> response = restTemplate.exchange(url, HttpMethod.GET, null, Response.class);
Выполнение response.getBody()
дает объект Response
, который содержит нулевой объект Result
. Очевидно, Джексон не десериализует JSON должным образом. Я подозреваю, что это из-за необычного text/x-json
Content-Type, возвращаемого API.
У меня также есть MappingJackson2HttpMessageConverter
объект, настроенный на возможность разбора text/x-json
Content-type, но не повезло:
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
jsonConverter.setSupportedMediaTypes(ImmutableList.of(new MediaType("text", "x-json")));
restTemplate.getMessageConverters().add(jsonConverter);
Есть указатели?
Обновление: я не знаю, почему это не сработало, но я нашел альтернативный способ - выбрать JSON как Map
вместо объекта домена, что достаточно для моих целей.