使用RestTemplate.exchange
调用查询端点时,我应该期待什么样的返回类型?
我的存储库有一个方法:
Page<Account> findAccountByFirstName(String name, Pageable pageable);
在我的集成测试中,我正在使用RestTemplate
进行以下调用:
ResponseEntity<List<Account>> accountResponse = restPleb.exchange(
new RequestEntity<Void>(HttpMethod.GET, getUri("/accounts/search/findByFirstName?firstName=Kevin")),
new ParameterizedTypeReference<List<Account>>() {}
);
响应中包含名为accounts
的对象中找到的资源列表:
{
"_embedded" : {
"accounts" : [ {
"lastName" : "Lastname",
"firstName" : "Kevin",
"phoneNumber " : "+44 7700000000",
"email" : "kevin@example.com",
"_links" : {
"self" : {
"href" : "http://localhost:53826/accounts/id"
},
"persistableAccount" : {
"href" : "http://localhost:53826/accounts/id"
}
}
} ]
},
"_links" : {
"self" : {
"href" : "http://localhost:53826/accounts/search/findByFirstName?firstName=Kevin"
}
},
"page" : {
"size" : 20,
"totalElements" : 1,
"totalPages" : 1,
"number" : 0
}
}
我得到以下错误:RestTemplate
和杰克逊之间无法弄清楚如何处理响应。大概这是因为它期待一个数组而不是一个对象。
org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
有没有办法让RestTemplate
向杰克逊提供正确的提示,以便正确反序化?我本以为必须有一种方法,就是它在分裂的两边是春天!
更新
我尝试将响应类型指定为Resources<Account>
,这可以防止抛出异常,而是提供一个空列表:Resources { content: [], links: [] }
答案 0 :(得分:1)
根据format,我必须以不同的方式解析它。此示例是否可用于解析 - 定义here
将转换器注册到模板 - &gt;并使用资源来解析响应。
public RestTemplate getRestTemplateWithHalMessageConverter() {
RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> existingConverters = restTemplate.getMessageConverters();
List<HttpMessageConverter<?>> newConverters = new ArrayList<>();
newConverters.add(getHalMessageConverter());
newConverters.addAll(existingConverters);
restTemplate.setMessageConverters(newConverters);
return restTemplate;
}
private HttpMessageConverter getHalMessageConverter() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new Jackson2HalModule());
MappingJackson2HttpMessageConverter halConverter = new TypeConstrainedMappingJackson2HttpMessageConverter(ResourceSupport.class);
halConverter.setSupportedMediaTypes(Arrays.asList(HAL_JSON));
halConverter.setObjectMapper(objectMapper);
return halConverter;
}