如何发出仅更新提供的字段的POST请求?

时间:2019-04-25 17:20:10

标签: java json spring jpa post

我正在尝试使用仅更新提供的字段的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>{

}

1 个答案:

答案 0 :(得分:2)

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

在REST控制器上,您可以接受Map<String, Object>,该@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; } 仅包含应该更新的字段。 PATCH或PUT URL应该具有需要更新的资源的ID。 使用FindById()从回购中获取原始对象

然后,您可以使用Apache BeanUtils之类的东西(或Spring提供的开箱即用的任何类似库)仅复制源中的属性,即将Map复制到目标对象。

go get -v github.com/mdempsky/gocode
runtime/cgo
# runtime/cgo
fork/exec ../cc_args.py: no such file or directory