Как запретить обновление поля во время исправления с помощью Java JSON Patch

У меня есть проект весенней загрузки, содержащий Pojo с именем Person и контроллер, который позволяет пользователю получать человека по идентификатору и исправлять объект Person, чтобы его имя или/и фамилия могли быть обновлены.

The Person Pojo (упрощено для примера)

class Person {
     @Id @GeneratedValue Long id;
     @NotNull @NotBlank String name;
     @NotNull @NotBlank String surname
}

В контроллере

@PatchMapping(path = "/{personId}", consumes = "application/json-patch+json")
ResponseEntity<Trip> patchPerson(@PathVariable Long personId,
                               @RequestBody final JsonPatch jsonPatch) throws JsonProcessingException, JsonPatchException {
    final Person targetPerson = personRepository.findOne(personId);

    final ObjectMapper objectMapper = new ObjectMapper();
    final JsonNode patch = objectMapper.convertValue(targetPerson, JsonNode.class);
    JsonNode patched = jsonPatch.apply(patch);
    final Person updatedPerson = objectMapper.treeToValue(patched, Person.class);

Как лучше всего добиться следующего поведения?

  • Отправлять все поля в качестве ответа при получении запроса GET.
  • Не позволяйте пользователю обновлять идентификатор при отправке исправления. Можно обновить только имя и фамилию.

Добавление примера патча, который я отправляю

[{ "op": "replace", "path":"/id", "value":"200" }]

person shanti    schedule 01.05.2020    source источник
comment
Вы смотрели на @JsonView от Джексона. Может быть, вы найдете более приятное решение. Учебник здесь: baeldung.com/jackson-json-view-annotation   -  person yodamad    schedule 01.05.2020
comment
Не раскрывайте сущность на уровне контроллера, если путь получает идентификатор пользователя, вы можете удалить его из класса POJO. Кроме того, взгляните на этот vladmihalcea.com/ нужно сделать Id обновляемым = false   -  person silentsudo    schedule 01.05.2020
comment
@yodamad - я посмотрю на JsonView.   -  person shanti    schedule 01.05.2020
comment
@silentsudo - я могу создать другое Projo из объекта, однако мне все еще нужно указать идентификатор, поскольку я хочу, чтобы пользователь мог запрашивать человека по его идентификатору. Я просто не хочу, чтобы они обновляли его, так как это просто создает много изменений и не представляет никакой ценности для пользователя.   -  person shanti    schedule 01.05.2020
comment
@shanti, можете ли вы добавить образец JsonPatch, который вы отправляете в тело запроса?   -  person Hemant    schedule 01.05.2020
comment
@Hemant - добавил пример патча к моему вопросу   -  person shanti    schedule 01.05.2020
comment
Что такое jsonpatch, покажите этот класс.   -  person improbable    schedule 01.05.2020
comment
@improbable — я использую эту библиотеку github.com/java-json-tools/json- патч   -  person shanti    schedule 02.05.2020
comment
поместите его тело в описание, ни у кого нет времени искать этот класс   -  person improbable    schedule 03.05.2020


Ответы (1)


Можете ли вы попробовать следующий код: после сохранения объекта любые последующие обновления отбрасываются, установив столбец идентификатора как updatable = false

class Person {

     @Id @GeneratedValue
     @Column(name = "id", updatable = false, nullable = false)
     Long id;
     @NotNull @NotBlank String name;
     @NotNull @NotBlank String surname
}
person silentsudo    schedule 01.05.2020
comment
Только что попробовал вашу рекомендацию. Однако в результате pojo по-прежнему успешно исправлено, и в базу данных каким-то образом вводится новая запись с автоматически сгенерированным номером вместо номера, предоставленного пользователем. Что по-прежнему является неправильной обработкой, так как я хочу обновить ту же запись, а не создавать новую. - person shanti; 01.05.2020