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

问题描述 投票:0回答:1

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

}
java json spring jpa post
1个回答
2
投票

要更新数据,根据REST标准,理想情况下会进行PATCH或PUT HTTP调用。我假设你只想更新json中提供的字段,它更像是一个PATCH。

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

然后,您可以使用类似Apache BeanUtils(或Spring提供的任何类似库)来复制源中的属性,即Map到目标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;
}
© www.soinside.com 2019 - 2024. All rights reserved.