我用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?)
我可能错过了一些东西,某处......
(代码使用Lombok的)
@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
工作,不是吗?
更多的调查之后,似乎这种行为是目的:将不会更新资源的链接,只有主属性。
我看着这一点,我要说你期待的东西,他们不工作的方式来工作。 PUT请求不考虑协会联的资源,由链接指向,即相关的资源。其原因有两方面:
- 如果我们考虑在有效载荷关联字段更新这些关联的URI时,问题来了什么是应该,如果没有指定URI的情况发生。在当前的行为,联协会是根本就没有有效载荷的一部分,因为它们只存在于_links块。我们在这种情况下两种选择:抹未交到协会,它打破了“把你会得到什么”的做法。只有抹正在使用空排序将模糊的“你把资源的整个状态”提供的电源。
- 在1中提到的所有原因有暴露专用关联资源可直接操纵。
所以看起来,如果你想在同一时间更改的资源加上协会的两个状态,我想揭露专门的资源来做到这一点是要走的路。
其他的帖子和链接: