Необязательные параметры запроса Spring

73
14 июня 2021, 21:00

Моя задача реализовать PATCH метод контроллера. Рассмотрим два случая:

  • я хочу изменить поле field сущности на null. И тогда я передаю json: {"field":null}
  • я не хочу изменять поле field. В json'е я опускаю поле field.

Spring в обоих случаях заполняет поле в DTO значением null, и сервис по изменению сущности не может различить две ситуации

В laravel (php) такое сделать легко - там данные из запроса сохраняются в ассоциативный массив. Можно проверить наличие того или иного поля в массиве.

Как быть в java?

Answer 1

Вот так попробуйте

@//тип_запросаMapping
@ResponseBody
public ResponseEntity<Ваш тип> method(@RequestParam(value = "parameter", required = false) Boolean parameter,
                @RequestParam(value = "id", required = false) Long id) {
Answer 2

Проблему решил с помощью Optional. Обернутые в Optional поля могут быть представлены как null - если в запросе не было представлено это поле или Optional.empty - если поле передано как null явно

Answer 3

В данном случае у Spring нет точного решения. Можно в контроллере принимать объект в виде Map из полей и поочередно устанавливать значения полученных полей. Например:

@PatchMapping("/{id}")
public ResponseEntity partialUpdate(@PathVariable Long id, @RequestBody Map<String, Object> fields) {
    YourEntity entity = findYourEntity(id);
    fields.forEach((fieldName, value) -> {
        Field field = ReflectionUtils.findField(KpiDataRecord.class, fieldName);
        ReflectionUtils.setField(field, entity, value);
    });
    saveObject(yourObject);
    return ResponseEntity.ok().build();
}

В данным решении используется Reflection для установления значений полей нового объекта. Но в таком случае пропадает возможность удобной валидации получаемых объектов.

READ ALSO
SugarORM не использует готовую Database

SugarORM не использует готовую Database

Пробую использовать готовую базу данных с SugarORM, копирую DB в нужную папку getApplicationContext()getDatabasePath("data

97
Верификация полей формы в модальном окне bootstrap vue

Верификация полей формы в модальном окне bootstrap vue

Есть небольшой vue проектИспользую bootstrap-vue

96