当前位置: 首页 > 面试题库 >

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

国景铄
2023-03-14
问题内容

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


问题答案:

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

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

其他帖子和链接:

  • “无法使用项目资源上的PUT请求更新关联的资源”:https : //jira.spring.io/browse/DATAREST-1001
  • “ Spring Data Rest PUT与PATCH LinkableResources”:[Spring Data Rest PUT与PATCH
  • “对于嵌套集合,其行为类似于PATCH”:https : //jira.spring.io/browse/DATAREST-1012


 类似资料:
  • 我在本地环境中创建了一个带有Laravel 7的网络应用程序,它有一个选项,用户可以上传和更改他们的个人资料图像。它在当地环境中运行良好。最近我把这个项目上传到一个子域下的实时服务器上。我把所有公共文件放在子域文件夹中,其他文件放在根文件夹中。像这样。 文件结构 现在当我运行 它将文件/public/images中的图像上传到hello中。实例com/images 文件上载代码:

  • 如何在GitHub上配置存储库,以便在不克隆整个存储库的情况下安装程序(任何版本,将有两个存储库)。克隆将通过Linux完成。该程序打包在中。焦油gz格式。

  • 我去了src目录,查看了zlib文件夹,然后看到…。它是空的... 现在,当我转到https://github.com/wxwidgets/wxwidgets/tree/master/src并浏览到zlib文件夹时,它不是空的。但是,在上面的链接中,zlib文件夹被标记了类似“@5888671”的东西。在expat、jpeg、png和tiff文件夹上也有类似的标记。当我克隆存储库时,所有提到的文件

  • 问题内容: 我想在我的新django项目中遵循RESTful模式,并且我想知道发出PUT / DELETE请求时参数在哪里。 据我所知,我只在请求中看到GET&POST QueryDict,没有其​​他人。Django是针对请求添加新的PUT还是DELETE QueryDict,还是将参数添加到GET或POST QueryDict? 问题答案: 我正在使用django v1.5。我主要使用Quer

  • Quarkus 1.8.3。最终的 直接调用访问PanacherRepository的方法可以按预期工作,但是当通过EventBus调用同一方法时,调用到达该方法并执行每一行,直到它到达任何存储库调用,然后在没有任何发生的指示的情况下无声地失败/退出。 根据日志,直接调用在Quarkus主线程中执行,事件总线调用在vert中执行。x-eventloop-thread-2。 还尝试了以下步骤的组合,