【问题标题】:Why RestTemplate drops links from HAL+JSON response?为什么 RestTemplate 从 HAL+JSON 响应中删除链接?
【发布时间】:2015-11-02 10:01:08
【问题描述】:

我正在使用 RestTemplate 测试通过 Spring DATA REST 公开的 API,并且在解析响应时无法获取链接。其余模板配置有 Jackson2HalModule 支持的 HttpConverter,并且请求的实体具有指向出现在 JSON 响应中的关联的链接。

这是 JSON

{
  "name" : "Hero @ Bangalore",
  "venue" : {
    "name" : "Wayne Manor",
    "address" : "1 MG Road",
    "city" : "Bangalore",
    "state" : "Karnataka",
    "pincode" : "560001"
  },
  "seatsAvailable" : 40,
  "workshopType" : "Batman Challengers",
  "date" : "2015-09-10",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/workshops/1{?projection}",
      "templated" : true
    },
    "venue" : {
      "href" : "http://localhost:8080/workshops/1/venue"
    }
  }
}

RestTemplate 配置为adviced in this post,因为我们得到的是 HAL+JSON 响应

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.registerModule(new Jackson2HalModule());
MappingJackson2HttpMessageConverter halConverter = new MappingJackson2HttpMessageConverter();
halConverter.setSupportedMediaTypes(Arrays.asList(MediaTypes.HAL_JSON));
halConverter.setObjectMapper(objectMapper);

restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> existingConverters = restTemplate.getMessageConverters();
List<HttpMessageConverter<?>> httpMessageConverters = new ArrayList<>();
httpMessageConverters.add(halMessageConverter);
httpMessageConverters.addAll(existingConverters);

现在,我希望链接在解析的响应对象中也可用,但事实并非如此,这是我获取响应的方式

ResponseEntity<Resource<Workshop>> workshopResource = 
restTemplate
        .exchange(DEFAULT_PROJECTION, HttpMethod.GET, null,
            new ParameterizedTypeReference<Resource<Workshop>>() {
            });

Workshop responseBody = workshopResource.getBody().getContent();

但是场地链接的断言失败

assertTrue(workshopResource.getBody().getLink("venue").equals(paulURI.toString()));  

提供NullPointerException

【问题讨论】:

    标签: json spring spring-data-rest spring-hateoas spring-web


    【解决方案1】:

    您没有将halConverter 注册到RestTemplate,因为您只是在查找现有的并将这些加上halConverter 添加到一个永远不会再次进入RestTemplate 的任意列表中。

    【讨论】:

    • 那个和workshopResource.getBody().getLink("venue") 并更改为workshopResource.getBody().getLink("venue").getHref().equals(...) 修复了测试
    猜你喜欢
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多