当通过关联链接访问时,为什么实体用Spring Data REST封装在内容对象中?

时间:2017-05-10 21:49:59

标签: java spring spring-data spring-data-rest spring-hateoas

将Spring Data REST与via JPARepsitory存储库一起使用,我有两个具有一对多关系的实体。

@Entity
class Owner {

    // owner attributes...

    @OneToMany
    Set<Item> items;
}

@Entity
class Item {

    // item attributes...

    @ManyToOne
    Owner owner;
}    

设置为ID为1的所有者具有ID为5的项目。

当我致电http://localhost:8080/api/items/5时,我会得到类似

的内容
{
  // item attributes
  "_links": {
    "self": {
      "href": "http://localhost:8080/api/items/5"
    },
    "item": {
      "href": "http://localhost:8080/api/items/5"
    },
    "owner": {
      "href": "http://localhost:8080/api/items/5/owner"
    }
  }
}

然后,当我致电http://localhost:8080/api/items/5/owner时,我得到了

{
  "content": {
    // owner attributes
  },
  "_links": {
    "self": {
      "href": "http://localhost:8080/api/owners/1"
    },
    "owner": {
      "href": "http://localhost:8080/api/owners/1"
    },
    "items": {
      "href": "http://localhost:8080/api/owners/1/items"
    }
  }
}

但是,如果我调用http://localhost:8080/api/owners/1(它是同一个实体,但是在身份href而不是关联href),我会得到类似

的内容
{
  // owner attributes
  "_links": {
    "self": {
      "href": "http://localhost:8080/api/owners/1"
    },
    "owner": {
      "href": "http://localhost:8080/api/owners/1"
    },
    "items": {
      "href": "http://localhost:8080/api/owners/1/items"
    }
  }
}

这里,当从单个关联资源调用时,所有者被包装在额外的content对象中。

更新以澄清

我希望如果我打电话给self href我会得到完全相同的表示,但在这种情况下我没有。我得到了规范的实体表示。

我的问题是,为什么会这样?如果通过关联资源返回的实体具有self href,该实例是从中检索实体的URI,或者通过关联资源返回的实体是否具有与实体项目资源相同的表示形式?

简而言之,当我打电话给http://localhost:8080/api/items/5/owner时,我希望得到

{
  "content": {
    // owner attributes
  },
  "_links": {
    "self": {
      "href": "http://localhost:8080/api/items/5/owner"
      // ^^^ the URI that was retrieved that will always return this representation
    },
    "owner": {
      "href": "http://localhost:8080/api/owners/1"
      // ^^^ the canonical entity URI
    },
    "items": {
      "href": "http://localhost:8080/api/owners/1/items"
    }
  }
}

{
  // owner attributes
  "_links": {
    "self": {
      "href": "http://localhost:8080/api/owners/1"
    },
    "owner": {
      "href": "http://localhost:8080/api/owners/1"
    },
    "items": {
      "href": "http://localhost:8080/api/owners/1/items"
    }
  }
}
// ^^^ The canonical entity representation (no "content" wrapper)

但不是两者的混合。

1 个答案:

答案 0 :(得分:2)

http://localhost:8080/api/items/5/owner指的是所谓的association resource。它没有指向“真正的”所有者资源。

它的目的是处理协会。例如。使用DELETE发送请求只会从项目中删除所有者,但不会删除实际的所有者实体。

根据配置,您可以获取所有者嵌入的所有属性。这就是你得到的content