Spring data-rest:通过 PATCH 请求设置空值

Posted

技术标签:

【中文标题】Spring data-rest:通过 PATCH 请求设置空值【英文标题】:Spring data-rest: set null value by PATCH request 【发布时间】:2015-03-07 16:30:54 【问题描述】:

我想通过发送空请求给实体设置空值。

例如:

PATCH: "deleteDate: null" to http://localhost/api/entity/1

但它不起作用。

我找到了here 信息如何处理 PATCH 请求:

创建了一个新的 Foo 实例 Foo 填充了随请求发送的所有值 已加载 URI 提供的 id 的 Foo 实体 两个对象之间不同的所有属性都从新 Foo 复制到持久 Foo,除非新 Foo 中的值为 null。

我是否正确理解,通过对 spring-data-rest 服务 API 的 PATCH 请求将值设置为 NULL 是不可能的?

【问题讨论】:

什么不完全有效?发送请求后控制器方法的当前行为是什么? 看看这个 Jira 项目jira.spring.io/browse/DATAREST-345 @zvdh,当前行为:没有任何变化。正在阅读... @zvdh,我使用的是 data-rest 2.1。它固定在2.2m1。谢谢。 所以请发布您的解决方案作为答案并接受它。通过这种方式,人们会立即看到问题已经解决,不再需要解决方案。 ;) 【参考方案1】:

egorlitvinenko's answer 的所有 3 个选项都将解决所描述的问题,但还会有另一个:

PATCH request 中未指定的所有其他属性也将“无效”。

好像spring-data-rest,issue-345 已经在v2.2.x 中修复了。

【讨论】:

如果你执行来自Entity entity = new Entity(); entity.setId(123); entity.setSomeField("foo"); executePatchReqeust(entity);的java请求,它们将被取消。这不是一个错误。当您执行请求时,它会转换为 JSON,在每个未指定的字段上都有 null。您可以为此目的使用java.util.Map【参考方案2】:

在 Spring 上下文中 PATCH 方法中的 null 值意味着没有更改。 如果你想写空值,你可以

1) 使用 PUT 方法; 2) 实现你自己的DomainObjectMerger 类,你可以在其中扩展方法合并与条件类似

sourceValue != targetValue;

3) 使用DomainObjectMerger.NullHandlingPolicy 配置。 取决于您的 Spring Data REST 版本。

【讨论】:

如何在 config 中配置 NullHandlingPolicy? (或其他地方?)

以上是关于Spring data-rest:通过 PATCH 请求设置空值的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data Rest - 如何防止通过 PATCH 更新特定字段?

PayPal - Spring - HTTP 方法无效:PATCH

使用 Spring MVC 在 tomcat 中的 PATCH 方法

在 Spring Boot 中使用 JsonPatchHandler 处理 PATCH 请求

Spring Data REST PATCH请求 远程代码执行漏洞案例(CVE-2017-8046)

从 JAVA Spring 创建对 Firebase 的 HTTP.PATCH 请求