Spring-hateoas客户端与spring-boot-data-rest不兼容?

时间:2016-02-23 17:29:08

标签: spring-boot spring-hateoas

为了了解春天的生态系统,我正在为各种零件建造一些玩具项目。

我有一个spring-boot-data-rest服务按预期工作(code here),我正在构建一个spring-boot和spring-hateoas客户端来访问它(code here)< / p>

但由于某种原因,我不明白客户端没有看到服务器的链接。

这就是服务所服务的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 boot 1.4.0.BUILD-SNAPSHOT版本。

这是我的代码的问题还是某个地方的错误?任何想法如何解决它?

2 个答案:

答案 0 :(得分:2)

您未启用对HAL的支持。您的服务器使用Spring Data REST,默认为uses HAL。另一方面,客户不知道HAL。您可以通过添加@EnableHypermediaSupport

来添加支持
@SpringBootApplication
@EnableHypermediaSupport(type = HypermediaType.HAL)
public class Application {

答案 1 :(得分:1)

正如@zeroflagL指出的那样,客户端不知道HAL。

解决方案更复杂,并在https://stackoverflow.com/a/23271778/932342处得出答案,将额外的HTTPMessageConverter注册到RestTemplate以处理&#34; application / hal + json&#34;内容。

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