我将Spring Data Rest
与Spring Boot
2.1.1.RELEASE一起使用。
我有一个与User
类有@ManyToMany
关系的Skill
类。
POST
来创建具有其技能的用户时,一切正常。PUT
来更新用户时,技能没有更新,不会产生任何错误。PATCH
而不是PUT
时,技能会正确更新。有人遇到过类似的问题吗? 我发现了另一个(旧的)问题,但是没有解决方法(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"]
}
firstName或lastName可以修改,但是技能保持不变。
如果我使用相同的有效载荷来进行PATCH
,则会正确修改技能。
它应该与PUT
一起使用,不是吗?
答案 0 :(得分:2)
经过更多调查后,看来此行为是有目的的:PUT不会更新资源链接,而只会更新主要属性。
奥利弗·吉尔克(Oliver Gierke)的回答是:https://jira.spring.io/browse/DATAREST-1001?focusedCommentId=135791&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-135791:
我调查了一下,我认为您期望事情以不起作用的方式起作用。 PUT请求不考虑与可链接资源的关联,即链接指向的相关资源。其原因有两个:
- 如果我们考虑有效载荷中用于关联字段的URI以更新这些关联,则会出现一个问题,即如果未指定URI,应该怎么办。就当前行为而言,链接的关联仅属于_links块,因此它们根本不是有效负载的一部分。在这种情况下,我们有两个选择:清除不处理的关联,这会破坏“输入得到的内容”方法。仅擦除使用null提供的内容会模糊“您放置资源的整个状态”。
- 出于1.中提到的所有原因,公开了专用的联合资源,可以直接对其进行操作。
因此,如果您想同时更改资源状态和关联状态,那么我想公开一种专用资源来做到这一点。
其他帖子和链接: