Java Spring数据Rest-在子引用上以静默方式放入存储库失败

Java Spring数据Rest-在子引用上以静默方式放入存储库失败,java,spring-data-rest,Java,Spring Data Rest,我使用Spring-Data-Rest和Spring-Boot2.1.1.RELEASE 我有一个类用户,与一个类技能有@manytomy关系 当我发布一篇POST来创建一个有技能的用户时,一切都很好 当我使用PUT更新用户时,技能不会更新,不会产生错误 但是当我制作一个补丁而不是放置时,技能会正确更新 有没有人遇到过类似的问题? 我发现了另一个(老)问题,但没有解决方法() 我可能错过了什么,在某个地方 (代码使用Lombok) 可以修改firstName或lastName,但技能保持不变

我使用
Spring-Data-Rest
Spring-Boot
2.1.1.RELEASE

我有一个类
用户
,与一个类
技能
@manytomy
关系

  • 当我发布一篇
    POST
    来创建一个有技能的用户时,一切都很好
  • 当我使用
    PUT
    更新用户时,技能不会更新,不会产生错误
  • 但是当我制作一个
    补丁
    而不是
    放置
    时,技能会正确更新
有没有人遇到过类似的问题? 我发现了另一个(老)问题,但没有解决方法()

我可能错过了什么,在某个地方

(代码使用Lombok)

可以修改firstName或lastName,但技能保持不变

如果我使用相同的有效载荷执行
补丁
,则技能将得到正确修改


它应该与一个
PUT
,不是吗?

经过更多的调查,似乎这种行为是故意的:PUT不更新资源链接,只更新主要属性

奥利弗·吉尔克的回答如下:

我调查过这件事,我认为你期望事情以一种不可行的方式运作。放置请求不考虑关联到可链接资源,即链接所指向的相关资源。原因有两方面:

如果我们在有效载荷中考虑关联字段的URI来更新这些关联,那么问题是如果没有指定URI,应该发生什么。在当前行为中,链接关联根本不是有效负载的一部分,因为它们只驻留在_links块中。在这个场景中,我们有两个选择:擦除未交的关联,这打破了“将所得到的放在一边”的方法。只有擦除使用null提供的资源,才会模糊“您放置了资源的整个状态”
  • 由于1中提到的所有原因。公开了专用的关联资源,可以直接操作
  • 所以看起来,如果您想同时更改资源和关联的两种状态,我想公开一个专用资源来完成这项工作是一个不错的选择

    其他帖子和链接:

    • “无法使用项目资源上的PUT请求更新关联的资源:”
    • “Spring数据Rest PUT v.s修补程序LinkableResources”:
    • “放置行为类似于嵌套集合的修补程序”:
    @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;
    }
    
    {
      "id": 7,
      "firstName": "John",
      "lastName": "Doe",
      "skills": ["http://localhost:9001/skills/1", "http://localhost:9001/skills/2", "http://localhost:9001/skills/3"]
    }