Почему RestTemplate удаляет ссылки из ответа HAL+JSON?

Я использую RestTemplate для тестирования API-интерфейсов, предоставляемых через Spring DATA REST, и я не могу получить ссылки при анализе ответа. Остальной шаблон настроен с помощью HttpConverter, поддерживаемого Jackson2HalModule, и запрошенная сущность имеет ссылки на ассоциации, которые отображаются в ответе 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 настроен в соответствии с рекомендованным в этом сообщении, так как мы получаем ответ 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


person Anadi Misra    schedule 10.08.2015    source источник


Ответы (1)


Вы не регистрируете halConverter с RestTemplate, поскольку вы только просматриваете существующие и добавляете их плюс halConverter в произвольный список, который никогда больше не попадает в RestTemplate.

person Oliver Drotbohm    schedule 11.08.2015
comment
это и workshopResource.getBody().getLink("venue") и изменение на workshopResource.getBody().getLink("venue").getHref().equals(...) исправили тест - person Anadi Misra; 11.08.2015