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 请求