【问题标题】:Spring data-rest: set null value by PATCH requestSpring data-rest:通过 PATCH 请求设置空值
【发布时间】: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。谢谢。
  • 所以请发布您的解决方案作为答案并接受它。通过这种方式,人们会立即看到问题已经解决,不再需要解决方案。 ;)

标签: java spring rest spring-data


【解决方案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? (或其他地方?)
猜你喜欢
  • 2018-04-15
  • 2016-03-23
  • 1970-01-01
  • 2018-01-08
  • 2015-09-11
  • 2018-06-26
  • 2017-03-14
  • 2017-08-20
  • 2018-03-31
相关资源
最近更新 更多