Spring Data-Rest POST 到子资源

Spring Data-Rest POST to sub-resource

假设我有以下结构:

@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/persons,(移动客户端要杀了我)。但即便如此,我什至从返回的实体中也没有 Task ID,所以我可以 PUTPerson 实体。 (我明明可以解析字符串,但我觉得不合适)。

我可能也不希望在 Person 实体中有一个包含 1000 个任务的列表。所以不导出 Task 实体并不是一个真正的选择(这意味着 PATCH 将不起作用)

那么,如果我无法获取他的 ID,我该如何将 PersonTask 相关联呢?什么是正确的做法?

在 HAL 中,Links 用于引用相关资源而不是 id,HAL 实体应该始终 return 一个 Link 到它自己,作为它的唯一标识符。

如果我没记错的话,您还可以使用 DBRef 注释字段,并且应该会为您生成链接。

如果您希望相关资源实际与数据内联显示,您必须起草一个预测。在这里查看更多:

最后但同样重要的是 - 如果您希望投影也包含 Links,您必须为它们制作 ResourceProcessor,请参见此处:

如果要将任务与人员相关联,您需要将 link 关联到人员。

假设这个人的 URI 是 http://localhost/persons/1

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

因此 post 任务可能如下所示:

{
  "description": "some text",
  "person": "http://localhost/persons/1"
}

Spring-data-rest 将查找人员并处理其余部分。