2016-02-23 6 views
0

Чтобы попытаться понять весеннюю экосистему, я создаю несколько игрушечных проектов на различных частях.Клиент Spring-hateoas не совместим с загрузкой данных с пружиной-загрузкой?

У меня есть сервис весна-загрузки данных, остальное работает, как ожидалось (code here) и я строй клиента весна-загрузка и пружинного hateoas для доступа к нему (code here)

НО по какой-то причине Я не понимаю, что клиент не видит ссылки, которые есть у сервера.

Это то, что JSON услуга служит выглядит следующим образом:

{ 
    "firstName": "Alice", 
    "lastName": "Foo", 
    "_links": { 
     "self": { 
      "href": "http://localhost:8080/people/1" 
     }, 
     "person": { 
      "href": "http://localhost:8080/people/1" 
     } 
    } 
} 

Это код, который использует клиент для запроса услуги:

//now use a GET to get it back 
    ResponseEntity<Resource<Person>> getResult = rest.exchange(
      "http://localhost:8080/people/1", HttpMethod.GET, null, 
      new ParameterizedTypeReference<Resource<Person>>() { 
      }); 

    //check the links on the response 
    log.info("getResult "+getResult); 
    log.info("getResult.getBody"+getResult.getBody()); 
    //uh oh, no links... 
    log.info("getResult.getLink(\"self\")"+getResult.getBody().getLink("self")); 
    log.info("getResult.getLink(\"self\").getHref()"+getResult.getBody().getLink("self").getHref()); 

И я использую Spring загрузки 1.4. Версия 0.BUILD-SNAPSHOT для обоих.

Это проблема с моим кодом или это ошибка где-то? Есть идеи, как это исправить?

ответ

1

Как @zeroflagL отметил, клиент, как ни малейшего представления о HAL.

Решение более сложное и использует ответ на https://stackoverflow.com/a/23271778/932342, чтобы зарегистрировать дополнительный HTTPMessageConverter в RestTemplate для обработки контента «application/hal + json».

RestTemplate rest = new RestTemplate(); 

    //need to create a new message converter to handle hal+json 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
    mapper.registerModule(new Jackson2HalModule()); 
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); 
    converter.setSupportedMediaTypes(MediaType.parseMediaTypes("application/hal+json")); 
    converter.setObjectMapper(mapper); 

    //add the new converters to the restTemplate 
    //but make sure it is BEFORE the exististing converters 
    List<HttpMessageConverter<?>> converters = rest.getMessageConverters(); 
    converters.add(0,converter); 
    rest.setMessageConverters(converters); 
+0

Первая часть в основном происходит, когда вы добавляете '@ EnableHypermediaSupport'. Но это не влияет на 'RestTemplate', только Spring MVC. Так что, к сожалению, вы правы, вы должны сделать это сами (пока). – zeroflagL

2

Вы не разрешили поддержку HAL. Сервер использует Spring Data REST, который по умолчанию имеет значение uses HAL. Клиент, с другой стороны, понятия не имеет о HAL. Вы можете добавить поддержку, добавив @EnableHypermediaSupport:

@SpringBootApplication 
@EnableHypermediaSupport(type = HypermediaType.HAL) 
public class Application { 
+0

Спасибо за ответ, но, к сожалению, он не работает для меня - я думаю, что аннотация предназначена для использования на сервере? Тем не менее, это поставило меня на путь решения! – afaulconbridge