RestTemplate 处理不一致的类型 List<Object> vs Object

RestTemplate handling inconsistent types List<Object> vs Object

我在获取响应数据类型不一致的 API 时使用 RestTemplate 时遇到问题。

我想知道是否有一种方法可以在不更改 API 本身的情况下使其工作(API 不是我的,所以我无法真正更改它)

我遇到这样一种情况,当我获取一个对象列表并且它 returns 不为空时,它的格式如下:

{
    "orders": [
        {
        ...
        }
     ]
}

但是当我用 limit 参数或其他 returns 0 结果调用此 api 时,响应格式如下所示

[]

我有一个 serialization/deserialization 的对象,其中有一个订单列表,所以当我得到超过 0 个结果时它会起作用。我不知道堆栈上是否已经有解决方案(我还没有找到)。

对如何处理这类问题有什么想法吗?

顺便说一句。我已经在 github 上为那个 API 创建了一个问题,但在它被修复之前我想让它以某种方式工作(感谢任何黑客 :))

编辑: Http 状态码始终为 200

这听起来像是服务器端问题,而不是读取信息的客户端问题。尝试使用某些基于浏览器的 REST 客户端(例如 chrome 中的 Advanced Rest Client (ARC) 或任何其他客户端调用相同的 rest API。查看空列表和非空列表的结果结构是否相同。如果它们与您上面描述的相同,那么它是服务器 API 问题而不是您客户端的问题。因此,如果是这种情况,您必须检查您的响应是否为 [] 并将其手动转换为 { "orders":[]}。如果不是这种情况,请查看您的客户端,或者使用不同的 HTTP 客户端

您可以通过使用自定义 objectmapper

来实现
public ObjectMapper createObjectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
    return objectMapper;
}

要使自定义 ObjectMapper 可用于 MappingJackson2HttpMessageConverter,只需创建一个新的 MappingJackson2HttpMessageConverter 并传入 ObjectMapper 实例。

private MappingJackson2HttpMessageConverter createMappingJacksonHttpMessageConverter() {
     MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
     converter.setObjectMapper(createObjectMapper());
     return converter;
}

然后,您可以创建一个 RestTemplate 并将您的自定义 MappingJackson2HttpMessageConverter 添加到其消息转换器列表中。

@Bean
public RestTemplate createRestTemplate() {
     RestTemplate restTemplate = new RestTemplate();
     restTemplate.getMessageConverters().add(0, 
     createMappingJacksonHttpMessageConverter());
}

然后现在使用此 restTemplate 将单个对象读取为 List

List<Model> models = restTemplate.exchange(uri,POST,entity,
             new ParameterizedTypeReference<List<Model>>>(){});