Spring Data-Rest POST到子资源

时间:2015-10-15 18:52:12

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

假设我有以下结构:

@Entity
class Person extends AbstractPersistable<Long> {

    String name
    String surname
}

@Entity
class Task extends AbstractPersistable<Long> {

    String description

    @ManyToOne
    Person person
}

如果我遵循正确的HAL指南,我不应该公开实体ID。由于我没有双向关系,因此我无法PUTPATCHhttp://localhost:8080/persons

即使我确实创建了关系,我可能也不想先POST Task/tasks然后PUT到{{1} },(移动客户端会杀了我)。但即便如此,我甚至不会从返回的实体中获得/persons,因此我可以Task IDPUT实体。 (我显然可以解析,但我认为这不合适。)

我可能不希望在Person实体中列出1000个任务。因此,不导出Person实体不是一个真正的选择(这意味着Task将无效)

那么,如果我无法获得他的身份,我应该如何将PATCHPerson联系起来?什么是正确的方法?

2 个答案:

答案 0 :(得分:3)

如果要将任务与人员关联,则需要指向该人员的链接。

假设此人URI为http://localhost/persons/1

然后,您可以通过在person属性中传递该URI来将人员分配给任务。

所以Task的帖子看起来像这样:

{{1}}

Spring-data-rest将查找该人并负责其余部分。

答案 1 :(得分:1)

在HAL中,链接用于引用相关资源而不是ID,而HAL实体应始终返回自身的链接,该链接用作其唯一标识符。

如果我没弄错,你也可以使用DBRef注释字段,并为你生成链接。

如果您希望相关资源实际显示为内嵌数据,则您必须草拟投影。点击此处了解更多信息:

Spring Boot REST Resource not showing linked objects (sets)

最后但并非最不重要 - 如果您希望Projections也包含链接,您必须为它们制作ResourceProcessor,请参阅此处:

How to add links to Spring Data REST projections?