13

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

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

根据HATEOAS Reference,预期为:

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

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

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

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

我正在使用带有以下构建文件的spring boot:

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"
}
4

6 回答 6

6

Spring Boot now (version=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注解即可。

于 2016-06-15T00:47:39.157 回答
6

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

@EnableAutoConfiguration(exclude = HypermediaAutoConfiguration.class)

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

于 2016-08-14T07:35:54.697 回答
4

如果您有可用的 HAL,它将由 spring boot 为您选择(并且“_links”是您使用 HAL 获得的)。您应该能够@EnableHypermediaSupport手动覆盖默认值。

于 2014-08-21T18:16:17.097 回答
3

我注意到至少在您尝试返回对象扩展 ResourseSupport 与包含对象扩展 ResourseSupport 的对象时出现问题。您甚至可以返回 List 或 Array of object(s) extends ResourseSupport 并具有相同的效果。请参阅示例:

@RequestMapping(method = GET, value = "/read")
public NfcCommand statusPayOrder() {
    return generateNfcCommand();
}

有回应:

{
    "field": "123",
    "_links": {
        "self": {
            "href": "http://bla_bla_bla_url"
        }
    }
}

当尝试包装为列表时:

@RequestMapping(method = GET, value = "/read")
public List<NfcCommand> statusPayOrder() {
    return Arrays.asList(generateNfcCommand());
}

得到:

[
    {
        "field": 123
        "links": [
            {
                "rel": "self",
                "href": "http://bla_bla_bla_url"
            }
        ]
    }
]

改变答案的结构不是正确的决定,但我们可以尝试以这种方式进一步思考。

于 2017-09-29T11:39:22.760 回答
0

我最近遇到了相反的问题,期望 HAL 形式(即_links)但总是得到links,尽管使用@EnableAutoConfiguration.

我的问题的解决方案在这里也可能有所帮助。由于从我找到的示例中复制和粘贴,我的 RestController@RequestMapping注释中有两种媒体类型

@RequestMapping(path="/example", produces = {MediaType.APPLICATION_JSON_VALUE, "application/hal+json"})

使用@EnableAutoConfigurationSpring HATEOASapplication/hal+json仅注册一个 ObjectMapper,在我的应用程序中,另一个负责MediaType.APPLICATION_JSON_VALUE赢得选择并呈现标准 JSON。

所以我的解决方案只设置produces="application/hal+json"为选择 Spring HATEOAS 对象映射器。在你的情况下,你应该尽量保持MediaType.APPLICATION_JSON_VALUE

于 2018-07-13T13:46:24.920 回答
0

我确定您正在使用带有 @RepositoryRestResource 注释的 Spring 数据

@RepositoryRestResource    
public interface XX extends CrudRepository<AA, String>

如果要删除默认 HAL 行为,可以添加以下注释参数

@RepositoryRestResource(exported = false)
public interface XX extends CrudRepository<AA, String>

以上配置 Spring Data REST 仅公开父项目中资源的 rest 端点,而无需显式注释依赖项目中的每个存储库。

根据文档

隐藏某些存储库、查询方法或字段 您可能根本不希望导出某个存储库、存储库上的查询方法或实体的字段。示例包括隐藏用户对象上的密码等字段或类似的敏感数据。要告诉导出器不要导出这些项目,请使用@RestResource 注释它们并设置exported = false。

例如,跳过导出存储库:

@RepositoryRestResource(exported = false)
interface PersonRepository extends CrudRepository<Person, Long> {}
于 2017-07-13T16:27:51.170 回答