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

2023-12-23

I use Spring Data Rest with Spring Boot2.1.1.发布。

我有课User with a @ManyToMany与类的关系Skill.

  • 当我做一个POST用他的技能创建一个用户,一切都很顺利。
  • 当我做一个PUT更新用户,技能不会更新,不会产生错误。
  • 但是当我做一个PATCH代替PUT,技能已正确更新。

有人遇到过类似的问题吗? 我发现了另一个关于它的(老)问题,但没有解决方案(Spring Data Rest - PUT 不适用于关联的引用类型? https://stackoverflow.com/questions/44117091/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"]
}

名字或姓氏可以修改,但技能保持不变。

如果我做一个PATCH相同负载下,技能修改正确。

它应该与PUT,不是吗?


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

Oliver Gierke 的答案在这里::

我对此进行了研究,我认为你期望事情以一种实际上行不通的方式进行。 PUT 请求不考虑与可链接资源的关联,即链接指向的相关资源。其原因有两个:

  1. 如果我们考虑有效负载中关联字段的 URI 来更新这些关联,就会出现这样的问题:如果未指定 URI,会发生什么情况。在当前行为中,链接关联根本不是有效负载的一部分,因为它们仅驻留在 _links 块中。在这种情况下,我们有两个选择:擦除未处理的关联,这打破了“PUT What you GET”的方法。仅擦除使用 null 提供的内容会模糊“您放置资源的整个状态”。
  2. 由于 1. 中提到的所有原因,存在可以直接操作的专用关联资源。

因此,如果您想同时更改资源和关联的状态,我想公开专用资源来执行此操作是可行的方法。

其他帖子和链接:

  • “无法使用项目资源上的 PUT 请求更新关联资源”:https://jira.spring.io/browse/DATAREST-1001 https://jira.spring.io/browse/DATAREST-1001
  • “Spring Data Rest PUT 与 PATCH LinkableResources”:Spring Data Rest PUT 与 PATCH LinkableResources https://stackoverflow.com/questions/45442419/spring-data-rest-put-v-s-patch-linkableresources
  • “PUT 的行为类似于嵌套集合的 PATCH”:https://jira.spring.io/browse/DATAREST-1012 https://jira.spring.io/browse/DATAREST-1012
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Data Rest - PUT 存储库在子引用上静默失败 的相关文章

  • 如何知道 HTTP 服务器何时完成发送数据

    我正在开发一个面向浏览器 代理的项目 我需要下载网页 向 Web 服务器发送自定义 HTTP 请求后 我开始监听服务器响应 读取响应时 我检查响应标头中的 Content Length row 如果我得到其中之一 很容易确定服务器何时完成发
  • 如何使用 Jsoup 获取包含非 ASCII 字符(ą、ś ...)的 URL?

    我正在使用 jsoup 解析一些波兰网站 但我对 URL 中的 等特殊字符有问题example com k t读起来像example com k 每个没有这个特殊字符的查询都可以完美运行 我努力了Document doc Jsoup par
  • 为 JSP 创建注销链接?

    当用户登录我的应用程序时 他提交一个要通过 Servlet 处理的表单 servlet 为用户创建一个会话 我如何创建一个链接以便用户可以注销 我似乎无法直接链接到 Servlet 如何删除会话并链接回主页 HttpSession sess
  • SharePoint 2010 Web 服务上的 Java JBoss 401 错误

    我的代码在 Eclipse IDE 中测试时运行成功 我正在使用生成的 Copy wsdl 通过 Web 服务连接到 MS SharePoint 2010 当我在 JBoss 服务器上部署代码 运行 Adob e LifeCycle 时 我
  • android新手需要了解“?android:attr/actionBarSize”

    我正在经历拉尔斯 沃格尔的教程 http www vogella com articles AndroidFragments article html在使用 Fragments 时 我遇到了以下代码 android layout margi
  • Android 服务 START_STICKY START_NOT_STICKY

    我需要让我的服务始终在后台运行 并使用 startService 函数启动我的服务 无论应用程序的状态如何 我都不想重新启动服务 这是我的观察 START STICKY gt 如果应用程序启动 则服务正在重新启动 当应用程序关闭时 服务也会
  • 从 Windows Batch (cmd.exe) 中的文件读取环境变量

    我正在尝试从批处理文件中读取变量 以便稍后在批处理脚本 Java 启动器 中使用 理想情况下 我希望所有平台 Unix Windows 上的设置文件都具有相同的格式 并且也是有效的 Java 属性文件 也就是说 它应该看起来像这样 sett
  • 在 Java 中将字符串复制到文件的开头

    我想将一个字符串写入文件的开头 我该怎么做 我根本不知道如何添加字符串 这就是我到目前为止所做的 public static void prepend String filename String data throws IOExcepti
  • Netbeans 雷达插件配置

    我使用的是 Netbeans 8 0 1 在提交到 SVN 之前 我需要从 IDE 运行并检查 SonarQube 分析 我已经安装了 Netbeans Radar 插件 用于启动本地分析并检查结果 这个插件有一个名为 Get Issues
  • 获取文本文件中行的字节偏移量?

    我有一个文本文件 例如 one two three four five 我需要获取文件中每一行的偏移量 我如何在 Java 中做到这一点 我搜索了一些 I O 库 如 BufferedReader 和 RandomAccessFile 但我
  • 如何用 Java 制作 Windows 7 工具提示

    我一直在网上到处寻找 但没有找到这个小问题的答案 在 Windows 7 中 我认为在 Vista 中 您有一个漂亮的圆形银色工具提示 它看起来比旧的黄色盒装蹩脚工具提示要好得多 下面的 How do I make a Windows 7
  • 在 Selenium Grid 中注册 PhantomJS 节点时出错

    我有以下问题 我成功启动了 Selenium Grid hub java jar selenium server standalone 2 53 0 jar role hub 之后我尝试使用以下命令启动 PhantomJS 节点 phant
  • 控制启动时的竞争条件

    我有一些代码想要执行一些一次性初始化 但这段代码没有明确的生命周期 因此在初始化完成之前 我的逻辑可能会被多个线程调用 所以 我想基本上确保我的逻辑代码 等待 直到初始化完成 这是我的第一次剪辑 public class MyClass p
  • 如何修复运行 Android 模拟器时出现 GPU Driver Issue 错误

    我的 Android 模拟器几周前运行良好 但现在出现错误 当我运行代码时 GPU 驱动程序问题错误对话框与模拟器一起弹出 当我单击 确定 时 Android 模拟器不会按预期运行应用程序 错误如下 Your GPU driver info
  • xclock 工作,X11 DISPLAY 设置但仍然 java.awt.HeadlessException:

    获取 java awt HeadlessException 似乎是一个非常常见的问题 并且 中已经讨论过 以下问题 没有 X11 DISPLAY 变量 这是什么意思 https stackoverflow com questions 662
  • 使用会话空闲超时进行轮询

    我对 Tomcat 中的所有应用程序使用单点登录 我的要求是 我必须轮询应从后端获取的事务状态 但它也不应该影响会话的空闲超时 有人可以建议是否可以做点什么吗 Thanx 我不知道是否有标准方法可以做到这一点 如果没有 你可以写一个过滤器
  • 谷歌的Json解析Gson库:JsonElement和JsonObject有什么区别?

    public abstract class JsonElement extends Object 表示 Json 元素的类 它可以是 JsonObject JsonArray JsonPrimitive 或 JsonNull public
  • 避免加密和编码的 URL 字符串中的换行符

    我正在尝试实现一个简单的字符串编码器来混淆 URL 字符串的某些部分 以防止它们被用户弄乱 我使用的代码几乎与示例中的相同JCA指南 http docs oracle com javase 6 docs technotes guides s
  • Java Media API:java media api 下载

    我在哪里可以找到javax media jar 文件 在sun站点它下载一个安装程序 有没有可用的java媒体jar 没有 javax media 具体是 jar 文件 该包位于 jmf jar 文件中 您需要运行安装程序并取出 jar 或
  • 请解释为什么Java和C对此代码给出不同的答案

    public class Test public static void main String args int i 10 i i System out println value of i is i 输出是 10 当我在中执行类似的代码

随机推荐

  • RAII 和系统资源清理

    RAII 是资源清理的一个很好的解决方案 然而 RAII 基于堆栈展开 如果进程异常终止 堆栈将不会被展开 这意味着 RAII 在这种情况下不起作用 对于进程生命周期的资源来说 这没什么好担心的 但是对于文件系统生命周期或者内核生命周期的资
  • 原则上,Android 设备是否可以通过蓝牙/GameKit 与 iPhone 连接?

    我对纯理论不感兴趣 但作为近期或中期的实际可能性 比如 12 24 个月内 作为一名熟悉 但不专门研究 两个主要智能手机平台的开发人员 我是否应该期望 Android 库的出现 它可以将自己欺骗到 iPhone 应用程序基于 GameKit
  • Spring mockMvc 在我的测试中不考虑验证

    我正在尝试使用mockMvc 设置集成测试 但遇到了问题 事实上 spring没有集成任何验证注解 为了更精确 我放置了可以测试的 Controller 类的代码 Controller public class UserRegisterCo
  • 带有外部更新的 NHibernate 二级缓存

    我有一个 99 只读的 Web 应用程序 有一个单独的服务以特定的时间间隔 例如每 10 分钟 更新数据库 该服务如何告诉应用程序使其二级缓存失效 它真的重要吗 我实际上并不关心我是否有太多过时的数据 如果我不使缓存失效 记录需要多长时间才
  • FBSDK 的 LLDB 问题,每当我放置断点时,我都会收到错误,并且无法打印任何变量

    每当我设置断点并尝试访问任何变量时 我都会收到此错误 如果我尝试在控制台中打印变量 则会收到以下错误 lldb p someVar error Error in auto import failed to get module Jogabo
  • 维护多个设置文件

    目前 我有一个包含各种单选按钮 目录浏览器 日期选择器等的表单 应用程序使用这些设置 并执行文件删除任务 我想知道将这些设置保存到可以稍后加载的外部文件的最佳策略是什么 因此基本上每个配置都可以被加载 执行 然后加载另一个配置 此外 配置可
  • Angular 2 Http 重试时间

    我正在尝试使用retryWhen在 HTTP 调用中 当尝试像这样使用时它工作得很好 return this http get environment apiUrl track this user instance id this curr
  • org.hibernate.event.def.EventCache 不支持 null 实体是什么意思?

    我在尝试保存实体时收到错误 我仅在启动服务器时收到此错误 而不是在使用 dbunit 运行单元测试时收到此错误 我正在努力拯救一个协会 我的单元测试应该与我在手动测试时遇到的情况完全相同 我正在关系的一端添加一个新实体 其中之前不存在任何关
  • 在 PowerPoint 中通过占位符名称处理形状

    我正在尝试创建一个函数 该函数将返回特定的形状 基于known分配给的名称属性CustomLayout Shapes Placeholder目的 我无法使用该形状 Name因为即使从模板 布局创建幻灯片时 这也是事先未知的 挑战似乎是自定义
  • 如何取消nuke pyside中的字体阴影

    I have a UI which automatically sets font shadow in nuke and how to cancel it I want the font on this button to look lik
  • git-svn:重置 master 的跟踪

    我在用着git svn使用 SVN 存储库 我的工作副本是使用创建的git svn clone s http foo bar myproject这样我的工作副本就遵循 SVN 的默认目录方案 主干 标签 分支 最近我一直在研究一个使用创建的
  • 动态选项卡中的动态内容(Angular、UI Bootstrap)

    我想在使用 AngularJs 和 UI Bootstrap 动态生成的选项卡的内容中使用 ng include 我这里有一个 Plunker http plnkr co edit 2mpbovsu2eDrUdu8t7SM p previe
  • 在 IIS 上运行时 GoogleWebAuthorizationBroker 将无法打开浏览器

    我有一个在 IIS 8 上运行的 Web 应用程序 这个 Web 应用程序 仅在本地运行 我们将其用作通过其打开的桌面应用程序Google Chrome 我正在尝试将视频上传到YouTube通过他们的 API 基本上我的问题就在这里 uc
  • Flutter:浮动操作按钮固定位置

    我有以下代码 return Scaffold appBar AppBar title Text Sample Code body ListView padding const EdgeInsets all 20 0 children
  • Typescript 库:隐藏内部导出

    我正在用 typescript 构建一个库 并通过 npm 发布 在作为库的起点的index ts中 所有公共类和枚举都被导出 import MyClass from internal my class import MyEnum from
  • 如何设置谷歌图表API区域设置

    我想将 google 图表 API 的语言设置为一个值 它当前使用访问该页面的浏览器的语言 如何将其设置为我的应用程序的语言 请参阅谷歌文档使用特定区域设置加载图表 https developers google com chart int
  • HTML 电子邮件 - 使图像适合表格单元格

    我有一张桌子 三个人td他们每个人都需要有图像 的宽度和高度td是固定的 但图像尺寸可能会变化 目标是在不扭曲细胞或图像本身的情况下拟合图像 不能用background image财产 我知道很糟糕 这是代码 table cellpaddi
  • 为什么预连接资源提示不起作用?

    我创建了一个测试页面crenshaw dev demo hints html http crenshaw dev demo hints html浏览器提示请求 dns prefetch 并预连接到 mac9416 com
  • PHP:对象类型转换为数组后出现奇怪的数组行为

    当你这样做时array的类型转换json decoded 值 与 assoc false PHP 创建一个带有字符串索引的数组 a array json decode 7 value1 8 value2 9 value3 13 value4
  • Spring Data Rest - PUT 存储库在子引用上静默失败

    I use Spring Data Rest with Spring Boot2 1 1 发布 我有课User with a ManyToMany与类的关系Skill 当我做一个POST用他的技能创建一个用户 一切都很顺利 当我做一个PUT