使用RestTemplate编组Spring Data REST查询结果

时间:2016-02-19 08:46:53

标签: java jackson spring-data spring-data-rest resttemplate

使用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: [] }

1 个答案:

答案 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;
}