I use Spring Data Rest
with Spring Boot
2.1.1.发布。
我有课User
with a @ManyToMany
与类的关系Skill
.
- 当我做一个
POST
用他的技能创建一个用户,一切都很顺利。
- 当我做一个
PUT
更新用户,技能不会更新,不会产生错误。
- 但是当我做一个
PATCH
代替PUT
,技能已正确更新。
有人遇到过类似的问题吗?
我发现了另一个关于它的(老)问题,但没有解决方案(Spring Data Rest - PUT 不适用于关联的引用类型? https://stackoverflow.com/questions/44117091/spring-data-rest-put-is-not-working-for-associated-reference-types)
我可能在某个地方错过了一些东西......
(使用龙目岛的代码)
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String lastName;
@ManyToMany
@JoinTable(name="user_skills")
private List<Skill> skills = new ArrayList<>();
}
@Entity
@Getter
@Setter
@NoArgsConstructor
@ToString
public class Skill {
@Id
@GeneratedValue
private Long id;
private String name;
}
我做了一个PUT
与以下JSON
内容:
{
"id": 7,
"firstName": "John",
"lastName": "Doe",
"skills": ["http://localhost:9001/skills/1", "http://localhost:9001/skills/2", "http://localhost:9001/skills/3"]
}
名字或姓氏可以修改,但技能保持不变。
如果我做一个PATCH
相同负载下,技能修改正确。
它应该与PUT
,不是吗?
经过更多调查,这种行为似乎是故意的:PUT 不更新资源链接,只更新主要属性。
Oliver Gierke 的答案在这里::
我对此进行了研究,我认为你期望事情以一种实际上行不通的方式进行。 PUT 请求不考虑与可链接资源的关联,即链接指向的相关资源。其原因有两个:
- 如果我们考虑有效负载中关联字段的 URI 来更新这些关联,就会出现这样的问题:如果未指定 URI,会发生什么情况。在当前行为中,链接关联根本不是有效负载的一部分,因为它们仅驻留在 _links 块中。在这种情况下,我们有两个选择:擦除未处理的关联,这打破了“PUT What you GET”的方法。仅擦除使用 null 提供的内容会模糊“您放置资源的整个状态”。
- 由于 1. 中提到的所有原因,存在可以直接操作的专用关联资源。
因此,如果您想同时更改资源和关联的状态,我想公开专用资源来执行此操作是可行的方法。
其他帖子和链接:
- “无法使用项目资源上的 PUT 请求更新关联资源”:https://jira.spring.io/browse/DATAREST-1001 https://jira.spring.io/browse/DATAREST-1001
- “Spring Data Rest PUT 与 PATCH LinkableResources”:Spring Data Rest PUT 与 PATCH LinkableResources https://stackoverflow.com/questions/45442419/spring-data-rest-put-v-s-patch-linkableresources
- “PUT 的行为类似于嵌套集合的 PATCH”:https://jira.spring.io/browse/DATAREST-1012 https://jira.spring.io/browse/DATAREST-1012
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)