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

时间:2019-01-30 16:57:53

标签: java spring-data-rest

我将Spring Data RestSpring 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一起使用,不是吗?

1 个答案:

答案 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请求不考虑与可链接资源的关联,即链接指向的相关资源。其原因有两个:

     
      
  1. 如果我们考虑有效载荷中用于关联字段的URI以更新这些关联,则会出现一个问题,即如果未指定URI,应该怎么办。就当前行为而言,链接的关联仅属于_links块,因此它们根本不是有效负载的一部分。在这种情况下,我们有两个选择:清除不处理的关联,这会破坏“输入得到的内容”方法。仅擦除使用null提供的内容会模糊“您放置资源的整个状态”。
  2.   
  3. 出于1.中提到的所有原因,公开了专用的联合资源,可以直接对其进行操作。
  4.   
     

因此,如果您想同时更改资源状态和关联状态,那么我想公开一种专用资源来做到这一点。

其他帖子和链接: