Spring boot Spring hateoas客户端与Spring引导数据rest不兼容?

Spring boot Spring hateoas客户端与Spring引导数据rest不兼容?,spring-boot,spring-hateoas,Spring Boot,Spring Hateoas,为了了解spring生态系统,我正在varios部件上构建一些玩具项目 我已经有了一个spring boot数据rest服务,它按预期工作(),我正在构建一个spring boot和spring hateoas客户端来访问它() 但是由于某些原因,我不明白客户端没有看到服务器的链接 这就是服务提供的JSON的样子: { "firstName": "Alice", "lastName": "Foo", "_links": { "self": {

为了了解spring生态系统,我正在varios部件上构建一些玩具项目

我已经有了一个spring boot数据rest服务,它按预期工作(),我正在构建一个spring boot和spring hateoas客户端来访问它()

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

这就是服务提供的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());
//现在使用GET将其取回
ResponseEntity getResult=rest.exchange(
"http://localhost:8080/people/1,HttpMethod.GET,null,
新的ParameteredTypeReference(){
});
//检查响应上的链接
log.info(“getResult”+getResult);
log.info(“getResult.getBody”+getResult.getBody());
//哦,没有链接。。。
log.info(“getResult.getLink(\“self\”)+getResult.getBody().getLink(“self”);
log.info(“getResult.getLink(\“self\”).getHref()”+getResult.getBody().getLink(“self”).getHref());
我使用的是SpringBoot1.4.0.BUILD-SNAPSHOT版本


这是我的代码的问题还是某个地方的bug?有没有办法修复它?

您没有启用对HAL的支持。您的服务器使用SpringDataREST,这是默认的。另一方面,客户对哈尔一无所知。您可以通过添加
@EnableHypermediaSupport
来添加支持:

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

您没有启用对HAL的支持。您的服务器使用SpringDataREST,这是默认的。另一方面,客户对哈尔一无所知。您可以通过添加
@EnableHypermediaSupport
来添加支持:

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

正如@zeroplagl所指出的,客户根本不知道哈尔

该解决方案更为复杂,它利用上的答案向RestTemplate注册一个额外的HTTPMessageConverter来处理“application/hal+json”内容

RestTemplate rest=new RestTemplate();
//需要创建一个新的消息转换器来处理hal+json
ObjectMapper mapper=新的ObjectMapper();
configure(在未知属性上反序列化feature.FAIL,false);
registerModule(新Jackson2HalModule());
MappingJackson2HttpMessageConverter=新的MappingJackson2HttpMessageConverter();
setSupportedMediaTypes(MediaType.parseMediaTypes(“application/hal+json”);
setObjectMapper(映射器);
//将新转换器添加到restTemplate
//但要确保它在现有转换器之前

正如@zeroflagL所指出的,客户对HAL一无所知

该解决方案更为复杂,它利用上的答案向RestTemplate注册一个额外的HTTPMessageConverter来处理“application/hal+json”内容

RestTemplate rest=new RestTemplate();
//需要创建一个新的消息转换器来处理hal+json
ObjectMapper mapper=新的ObjectMapper();
configure(在未知属性上反序列化feature.FAIL,false);
registerModule(新Jackson2HalModule());
MappingJackson2HttpMessageConverter=新的MappingJackson2HttpMessageConverter();
setSupportedMediaTypes(MediaType.parseMediaTypes(“application/hal+json”);
setObjectMapper(映射器);
//将新转换器添加到restTemplate
//但要确保它在现有转换器之前

list谢谢你的回答,但不幸的是它对我不起作用-我认为注释是用于服务器的?不管怎样,这确实让我走上了解决问题的轨道!谢谢你的回答,但不幸的是它对我不起作用-我想注释是在服务器上使用的?不管怎样,这确实让我走上了解决问题的轨道!第一部分是添加
@EnableHypermediaSupport
时发生的基本情况。但这并不影响RestTemplate,只影响SpringMVC。不幸的是,你是对的,你必须自己去做。第一部分基本上是当你添加
@EnableHypermediaSupport
时会发生什么。但这并不影响RestTemplate,只影响SpringMVC。不幸的是,你是对的,你必须自己去做。