Как сделать POST-запрос, который обновляет только предоставленные поля? - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь сделать пост-запрос с данными 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)

какЯ делаю так, чтобы maxRiskDollars оставалось на прежнем значении, когда поле не было предоставлено в запросе JSON?

РЕДАКТИРОВАТЬ: Предоставление внутреннего кода в соответствии с запросом - это JAVA / SPRING / HIBERNATE

Контроллер:

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

Репозиторий:

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

}

1 Ответ

2 голосов
/ 25 апреля 2019

Для обновления данных, в соответствии со стандартами REST, в идеале выполняется HTTP-вызов PATCH или PUT. Я предполагаю, что поскольку вы хотите обновить только поля, представленные в json, более вероятно, что это будет PATCH.

В REST Controller вы можете принять Map<String, Object>, который будет состоять только из полей, которые должны быть обновлены. URL-адрес PATCH или PUT должен содержать идентификатор ресурса, который необходимо обновить. Получить исходный объект из репозитория с помощью FindById ()

Тогда вы можете использовать что-то вроде Apache BeanUtils (или любую аналогичную библиотеку, которую Spring предоставляет из коробки), чтобы копировать только свойства из вашего источника, т. Е. Map в целевой объект.

@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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...