我正在调用一个端点,该端点返回看起来像这样的JSON(在Postman中):
Mask
此请求返回的Content-Type标头为{
"Result": {
"attribute1": { ... },
"attribute2": { ... }
}
}
(与通常的text/x-json
相反)。我认为这在尝试通过Jackson进行反序列化时会引起一些问题。 JSON的POJO看起来像这样:
application/json
@Getter
@Setter
public class Response {
@JsonProperty("Result")
private Result result;
}
类来自外部库(编写此终结点的人相同)。无论哪种方式,当我尝试通过Result
调用此终结点时,Jackson都无法将该JSON反序列化为有效的RestTemplate.exchange()
类。我正在这样做:
Result
执行ResponseEntity<Response> response = restTemplate.exchange(url, HttpMethod.GET, null, Response.class);
会得到一个response.getBody()
对象,其中包含一个空Response
对象。显然,Jackson没有正确反序列化JSON。我怀疑这是由于API返回的异常Result
Content-Type。
我也将text/x-json
对象配置为能够解析MappingJackson2HttpMessageConverter
内容类型,但没有运气:
text/x-json
有指针吗?
更新:我不知道为什么它不起作用,但是我想出了另一种方法-以MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
jsonConverter.setSupportedMediaTypes(ImmutableList.of(new MediaType("text", "x-json")));
restTemplate.getMessageConverters().add(jsonConverter);
而不是域对象的形式获取JSON,这足以满足我的目的。>
答案 0 :(得分:3)
默认情况下,MappingJackson2HttpMessageConverter
绑定到:
我们需要添加text/x-json
。
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
List<MediaType> jsonTypes = new ArrayList<>(jsonConverter.getSupportedMediaTypes());
jsonTypes.add(new MediaType("text", "x-json"));
jsonConverter.setSupportedMediaTypes(jsonTypes);
现在,我们应该在RestTemplate
中使用它:
restTemplate.setMessageConverters(Collections.singletonList(jsonConverter));
ResponseEntity<RequestPayload> response = restTemplate.exchange(url, HttpMethod.GET, null, RequestPayload.class);