【问题标题】:How to make a POST request that only updates the provided fields?如何发出仅更新提供的字段的 POST 请求?
【发布时间】:2019-04-25 17:20:10
【问题描述】:

我正在尝试使用仅更新提供的字段的 json 数据发出发布请求。目前,当我在请求正文中不提供字段时,它会重置为默认值。

当我发送这个时:

{
    "id": 59706975,
    "maxRiskDollars": 1000,
    "maxRiskCashPercent": 0.01
}

我收到此回复

{
    "id": 59706975,
    "maxRiskDollars": 1000,
    "maxRiskCashPercent": 0.01
}

然后我发送这个:

{
    "id": 59706975,
    "maxRiskCashPercent": 0.02
}

然后得到这个:

{
    "id": 59706975,
    "maxRiskDollars": 50,
    "maxRiskCashPercent": 0.02
}

(50 是 maxRiskDollars 的默认值)

当 JSON 请求中未提供该字段时,如何使 maxRiskDollars 保持先前的值?

编辑: 按要求提供后端代码 - 这是 JAVA/SPRING/HIBERNATE

控制器:

@PostMapping("/tradeManagers")
TradeManager newTradeManager(@RequestBody TradeManager newTradeManager) {
    return tradeManagerRepo.save(newTradeManager);
}

存储库:

@Repository
public interface TradeManagerRepo extends CrudRepository<TradeManager, Long>{

}

【问题讨论】:

  • 我们可以看看你的代码吗?
  • POST 请求不是问题。您向其发出 ajax 请求的网站未按您希望的方式处理您的请求
  • @Benjamin Urquhart 确定我刚刚编辑了问题以包含我的控制器和存储库
  • 这没什么用
  • 抱歉,仅此而已 - 这是开箱即用的普通香草弹簧实现。

标签: java json spring jpa post


【解决方案1】:

要更新数据,根据 REST 标准,理想情况下会进行 PATCH 或 PUT HTTP 调用。我假设由于您只想更新 json 中提供的字段,因此它更有可能是 PATCH。

在 REST 控制器上,您可以接受 Map&lt;String, Object&gt;,它只包含应该更新的字段。 PATCH 或 PUT URL 应该具有需要更新的资源的 id。 使用 FindById() 从 repo 中获取原始对象

然后您可以使用类似Apache BeanUtils(或 Spring 提供的任何类似库)来仅复制源中的属性,即映射到目标对象。

@PatchMapping("/tradeManagers/{tradeManagerId}")
Map<String, Object> newTradeManager(@RequestBody Map<String, Object> tradeManagerMap, 
    @PathVariable(name = "tradeManagerId") String trademanagerId) {
    Trademanager  tradeManger = tradeManagerRepo.findById(tradeManagerId);
    BeanUtils.copyProperties(trademanager, tradeManagerMap);
    return tradeManagerMap;
}

【讨论】:

    猜你喜欢
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    相关资源
    最近更新 更多