使用Spring Data Rest在单个PUT查询中更新属性和资源链接

问题描述 投票:3回答:1

好,让我们开始自引用对象,类似这样:

@Data
@Entity
public class FamilyNode {
    @Id
    @GeneratedValue
    private long id;

    private boolean orphan;

    @ManyToOne
    private FamilyNode parent;
}

还有一个标准的资源库休息资源,如下所示:

@RepositoryRestResource(collectionResourceRel = "familynodes", path = "familynodes")
public interface FamilyNodeRepository extends CrudRepository<FamilyNode, Long> {
}

[现在,让我想链接的某些父对象已经存在于ID=1ID=2中,每个对象都是用POST/api/familynodes创建的,看起来像这样:

{
    "orphan": true,
}

[如果我尝试使用对ID=3POST请求使用类似的方法来创建新的客户端(/api/familynodes),则在DB中的链接资源更新正常的情况下,它将正常工作。

{
    "orphan": false,
    "parent": "/api/familynodes/1"
}

但是,如果我尝试对PUT的以下主体执行/api/familynodes/3,则父属性似乎无提示,并且数据库未更新以反映新的关联:

{
    "orphan": false,
    "parent": "/api/familynodes/2"
}

类似地(这是我要讲的用例),像这样的PUT只会更新orphan属性,而使父级保持不变:

{
    "orphan": true,
    "parent": null
}

因此,您现在拥有一个声称是孤儿但仍然有父母的记录。当然,您可以直接对资源URI进行后续的REST请求,但是我正在尝试使rest操作成为原子操作,这样任何单个rest查询都不可能创建无效状态。因此,现在我正在努力处理一个简单的用例,而又没有编写自己的控制器来处理它-我是否在spring数据剩余领域中缺少一种机制?

spring spring-data-rest
1个回答
0
投票

这是Spring Data Rest 2.5.7及更高版本中PUT请求的预期行为,其中PUT请求不更新资源链接,仅更新主要属性。

如Oliver Gierke的详细here

如果我们考虑有效载荷中关联字段的URI以更新这些关联,则会出现一个问题,即如果未指定URI,将会发生什么情况。就当前行为而言,链接关联根本不属于有效负载,因为它们仅位于_links块中。在这种情况下,我们有两种选择:清除不处理的关联,这会破坏“输入得到的内容”方法。仅擦除使用null提供的内容会模糊“您放置资源的整个状态”。

您可以使用PATCH代替PUT来获得所需的结果

© www.soinside.com 2019 - 2024. All rights reserved.