小编典典

Spring Data Rest-子引用上的存储库上的PUT静默失败

java

我用Spring Data RestSpring Boot2.1.1.RELEASE。

我有一堂课User和一个班级有@ManyToMany关系Skill

  • 当我POST用自己的技能创建用户时,一切工作正常。
  • 当我PUT更新用户时,技能不会更新,不会产生任何错误。
  • 但是当我用a PATCH代替a时PUT,技能会正确更新。

我可能在某处错过了一些东西…

(使用龙目岛代码)

@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,不是吗?


阅读 191

收藏
2020-11-26

共1个答案

小编典典

经过更多调查后,似乎此行为是有目的的: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.中提到的所有原因,公开了专用的联合资源,可以直接对其进行操作。

因此,如果您要同时更改资源状态和关联状态,则看起来就像暴露一个专用资源来做到这一点。

其他帖子和链接:

2020-11-26