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
- 但是当我制作一个
而不是补丁
时,技能会正确更新放置
补丁
,则技能将得到正确修改
它应该与一个
PUT
,不是吗?经过更多的调查,似乎这种行为是故意的:PUT不更新资源链接,只更新主要属性
奥利弗·吉尔克的回答如下:
我调查过这件事,我认为你期望事情以一种不可行的方式运作。放置请求不考虑关联到可链接资源,即链接所指向的相关资源。原因有两方面:
如果我们在有效载荷中考虑关联字段的URI来更新这些关联,那么问题是如果没有指定URI,应该发生什么。在当前行为中,链接关联根本不是有效负载的一部分,因为它们只驻留在_links块中。在这个场景中,我们有两个选择:擦除未交的关联,这打破了“将所得到的放在一边”的方法。只有擦除使用null提供的资源,才会模糊“您放置了资源的整个状态”
- “无法使用项目资源上的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"]
}