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>>>(){});
我在获取响应数据类型不一致的 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>>>(){});