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。因为我没有双向关系,所以我不能 PUT
或 PATCH
到 http://localhost:8080/persons
。
即使我确实创建了关系,我也可能不想先 POST
Task
到 /tasks
然后 PUT
到 /persons
,(移动客户端要杀了我)。但即便如此,我什至从返回的实体中也没有 Task ID
,所以我可以 PUT
到 Person
实体。 (我明明可以解析字符串,但我觉得不合适)。
我可能也不希望在 Person
实体中有一个包含 1000 个任务的列表。所以不导出 Task
实体并不是一个真正的选择(这意味着 PATCH
将不起作用)
那么,如果我无法获取他的 ID,我该如何将 Person
与 Task
相关联呢?什么是正确的做法?
在 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 将查找人员并处理其余部分。
假设我有以下结构:
@Entity
class Person extends AbstractPersistable<Long> {
String name
String surname
}
@Entity
class Task extends AbstractPersistable<Long> {
String description
@ManyToOne
Person person
}
如果我遵循正确的 HAL
准则,我就不会公开实体 ID。因为我没有双向关系,所以我不能 PUT
或 PATCH
到 http://localhost:8080/persons
。
即使我确实创建了关系,我也可能不想先 POST
Task
到 /tasks
然后 PUT
到 /persons
,(移动客户端要杀了我)。但即便如此,我什至从返回的实体中也没有 Task ID
,所以我可以 PUT
到 Person
实体。 (我明明可以解析字符串,但我觉得不合适)。
我可能也不希望在 Person
实体中有一个包含 1000 个任务的列表。所以不导出 Task
实体并不是一个真正的选择(这意味着 PATCH
将不起作用)
那么,如果我无法获取他的 ID,我该如何将 Person
与 Task
相关联呢?什么是正确的做法?
在 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 将查找人员并处理其余部分。