Diff HTTP PUT метод весной / JPA / Джексон - PullRequest
0 голосов
/ 11 января 2019

Мне интересно, как лучше всего использовать метод PUT для обновления определенного свойства объекта, хранящегося в БД.

Давайте рассмотрим, например, следующий json, полученный на контроллере покоя:

{"id":1, "surname":"Doe"}

Сохраненная нами сущность выглядит примерно так:

public class Employee {
    Long id;
    String name;
    String surname;
    Date createdAt;
    Date updatedAt;
}

Я упустил аннотации для простоты.

Чего я хотел бы добиться, так это того, что на RestController я получаю что-то вроде этого:

@PutRequest
public Employee updateEmployee(@RequestBody Employee employee) {
    repo.saveAndFlush(employee);
}

Итак, если я сделаю это, то существующие поля для name и отметок времени будут установлены в ноль, поскольку предоставленная сущность не содержит таких полей.

Мне интересно, есть ли способ выполнить следующие действия:

  • Загрузить объект с идентификатором, указанным в БД
  • Обновите поля, указанные в Json / Request Body.
  • Сохранить обновленную сущность -> Это можно сделать так же, как я показал в коде.

Мне известно, что существуют @JsonIdentity и @JsonIdentifyreference (alwaysAsId = true), которые я использую вместе с распознавателями для извлечения данных из БД для извлечения вложенной сущности, где предоставляется только идентификатор, а не сама сущность.

1 Ответ

0 голосов
/ 11 января 2019

PATCH метод предназначен для этой функциональности.

PUT следует использовать при замене всего ресурса - это означает установку null для полей, которые вы не указали в запросе.

PATCH используется для обновления ресурса, вы можете обновить одно поле или все поля по вашему выбору.

Имейте в виду, что само обновление базы данных может не работать автоматически только потому, что вы изменили метод HTTP. Для Hibernate есть @DynamicUpdate, который обеспечивает ту же функциональность. Без @DynamicUpdate поля, установленные на null, будут обновлены, но с @DynamicUpdate будут обновлены только те поля, которые были изменены.

...