我用Spring Data Rest与Spring Boot2.1.1.RELEASE。
Spring Data Rest
Spring Boot
我有一堂课User和一个班级有@ManyToMany关系Skill。
User
@ManyToMany
Skill
POST
PUT
PATCH
我可能在某处错过了一些东西…
(使用龙目岛代码)
@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内容制作:
JSON
{ "id": 7, "firstName": "John", "lastName": "Doe", "skills": ["http://localhost:9001/skills/1", "http://localhost:9001/skills/2", "http://localhost:9001/skills/3"] }
firstName或lastName可以修改,但是技能保持不变。
如果我PATCH使用相同的有效载荷进行操作,则技能将正确修改。
它应该与一起使用PUT,不是吗?
经过更多调查后,似乎此行为是有目的的:PUT不会更新资源链接,而只会更新主要属性。
来自Oliver Gierke的答案是在这里:https : //jira.spring.io/browse/DATAREST-1001?focusedCommentId = 135791 & page = com.atlassian.jira.plugin.system.issuetabpanels%3Acomment- tabpanel#comment-135791 :
我调查了一下,我认为您期望事情以不起作用的方式起作用。PUT请求不考虑与可链接资源的关联,即链接指向的相关资源。其原因有两个: 1. 如果我们考虑有效载荷中用于关联字段的URI以更新那些关联,则会出现一个问题,即如果未指定URI将会发生什么情况。就当前行为而言,链接关联根本不属于有效负载,因为它们仅位于_links块中。在这种情况下,我们有两种选择:清除不处理的关联,这会破坏“输入得到的内容”方法。仅擦除使用null提供的内容会模糊“您放置资源的整个状态”。 2. 出于1.中提到的所有原因,公开了专用的联合资源,可以直接对其进行操作。 因此,如果您要同时更改资源状态和关联状态,则看起来就像暴露一个专用资源来做到这一点。
我调查了一下,我认为您期望事情以不起作用的方式起作用。PUT请求不考虑与可链接资源的关联,即链接指向的相关资源。其原因有两个:
1. 如果我们考虑有效载荷中用于关联字段的URI以更新那些关联,则会出现一个问题,即如果未指定URI将会发生什么情况。就当前行为而言,链接关联根本不属于有效负载,因为它们仅位于_links块中。在这种情况下,我们有两种选择:清除不处理的关联,这会破坏“输入得到的内容”方法。仅擦除使用null提供的内容会模糊“您放置资源的整个状态”。 2. 出于1.中提到的所有原因,公开了专用的联合资源,可以直接对其进行操作。
因此,如果您要同时更改资源状态和关联状态,则看起来就像暴露一个专用资源来做到这一点。
其他帖子和链接: