【问题标题】:Null values update with Spring Rest Resource使用 Spring Rest 资源更新 Null 值
【发布时间】:2015-11-01 13:14:36
【问题描述】:

有一个用 RestResource 注释的类(Spring 3.1,Jackson 2.3)。 当我们尝试像那样保存对象 A 时

A: {"prop1":1, "prop2":2} 

保存成功。

我们有以下代码:

A.setProp2(null);
EntityService.patch(A);
A: {"prop1":1, "prop2":null} 

EntityService.patch(A) 执行后,DB (Oracle 11g) 中没有任何变化,但我们希望 DB 中的 prop2 也等于 null。

这是一种正常的行为吗(我想可能是的,因为 null-value 可能会像没有改变一样理解)? 有没有一种简单的方法可以改变这种行为?

【问题讨论】:

    标签: java spring spring-mvc spring-data-rest


    【解决方案1】:

    在谈到 HTTP 动词时,PATCH 请求描述了应该对现有对象进行的差异。这样做是为了让您可以轻松地创建部分更新,而无需通过 REST 公开特定的资源属性。

    在 Spring 框架中,在 PATCH 请求的上下文中,属性的 null 值意味着不应更改该属性。我猜想 spring data rest 将此逻辑传输到服务层,因此为了使用 null 值实际更新您的资源,您应该发出与 PUT 语义对应的调用

    【讨论】:

    【解决方案2】:

    所以,上面的答案是对的。

    不幸的是,PUT 方法会更新所有字段,在某些情况下它可能是一个糟糕的解决方案。例如,如果我们在 JSON 对象中有很多空值,而这些空值没有被修改。

    为了让 Spring PATCH 更新空值,只有在它发生变化时,我发现最好的方法是扩展 DomainObjectMerger 类。 它是 REST MVC 配置的一个 bean,我们可以在其中覆盖方法 merge (entity.doWithProperties(new SimplePropertyHandler() {})。 在这种方法中,我们可以添加添加条件,如

    sourceValue != targetValue;
    

    独立于 sourceValue 变量的空值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2014-04-25
      • 1970-01-01
      • 2017-11-21
      相关资源
      最近更新 更多