繁体   English   中英

使用RestTemplate编组Spring数据REST查询结果

[英]Marshalling Spring Data REST Query Results with 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和Jackson无法弄清楚该如何处理响应。 大概是因为它期望一个数组而不是一个对象。

org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token

有没有办法让RestTemplate给Jackson正确的提示以正确地反序列化呢? 我本以为一定有办法,因为鸿沟在两边!

更新资料

我尝试将响应类型指定为Resources<Account> ,这可以防止引发异常,而是提供一个空列表: Resources { content: [], links: [] }

按照格式 ,我想它必须以不同的方式解析。 可以使用此示例进行解析- 此处定义

将转换器注册到模板->并使用资源来解析响应。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM