返回的json出乎意料,有“links”拼写为“_links”,结构不同,在Spring hateoas中

正如标题所说,我有一个扩展的资源对象。但是,我收到的响应具有属性“_links”而不是“链接”,并且具有不同的结构。ProductResourceSupport

{
  "productId" : 1,
  "name" : "2",
  "_links" : {
    "self" : {
      "href" : "http://localhost:8080/products/1"
    }
  }
}

根据 HATEOAS 参考,预期为:

{
  "productId" : 1,
  "name" : "2",
  "links" : [
    {
      "rel" : "self"
      "href" : "http://localhost:8080/products/1"
    }
  ]
}

这是故意的吗?有没有办法改变它,或者如果不是结构,就去“链接”?

我通过以下代码段添加了 selfLink:

product.add(linkTo(ProductController.class).slash(product.getProductId()).withSelfRel());

我正在将弹簧引导与以下构建文件一起使用:

dependencies {
    compile ("org.springframework.boot:spring-boot-starter-data-rest") {
        exclude module: "spring-boot-starter-tomcat"
    }

    compile "org.springframework.boot:spring-boot-starter-data-jpa"
    compile "org.springframework.boot:spring-boot-starter-jetty"
    compile "org.springframework.boot:spring-boot-starter-actuator"

    runtime "org.hsqldb:hsqldb:2.3.2"

    testCompile "junit:junit"
}

答案 1

Spring Boot now(版本 =1.3.3.RELEASE)具有一个属性,用于控制 .PagedResources

只需将以下配置添加到您的文件中:application.yml

spring.hateoas.use-hal-as-default-json-media-type: false

如果您需要输出如下(基于问题):

{
  "productId" : 1,
  "name" : "2",
  "links" : [
    {
      "rel" : "self"
      "href" : "http://localhost:8080/products/1"
    }
  ]
}

编辑:

顺便说一句,您只需要以这种方式进行注释。@EnableSpringDataWebSupport


答案 2

另一种选择是禁用整个超媒体自动配置功能(这是在这里的一个+ REST示例中完成的方式):spring-boot

@EnableAutoConfiguration(exclude = HypermediaAutoConfiguration.class)

据我所知,除了配置HAL之外,它并没有真正做很多事情,所以禁用它应该是完全可以的。HypermediaAutoConfiguration


推荐