Если у меня есть следующий dto в весенней загрузке
public class PersonDto {
@JsonProperty(access = Access.READ_ONLY)
private Long id;
@NotBlank
private String name;
//@NotNull
@JsonProperty(access = Access.READ_ONLY)
private Integer age;
}
И я хочу выполнить HTTP PATCH в соответствии с этим стандартом, который реализуется JsonPatch, я бы написал что-то подобное, чтобы получить пропатченный JsonNode
JsonNode patched = patch.apply(objectMapper.convertValue(target, JsonNode.class));
Однако при выполнении операции исправления, подобной следующей, @JsonProperty(access = Access.READ_ONLY)
не будет иметь никакого эффекта (это означает, что возраст будет установлен на 12)
[ {"op":"replace","path":"/age","value": 12} ]
Я также пробовал следующее впоследствии
return objectMapper.treeToValue(patched, PersonDto.class)
Но здесь возраст установлен на ноль
Итак, ожидаемое поведение, которого я хочу добиться, следующее:
Всякий раз, когда я получаю операцию исправления, которая пытается заменить значение «возраст», я хочу, чтобы эта операция игнорировалась, поскольку возраст доступен только для чтения.
Я знаю, что могу создать операторы if в контроллере, чтобы проверять каждую операцию исправления и игнорировать ее, если она пытается изменить поле, которое я хочу сделать доступным только для чтения, например возраст, но я бы предпочел сделать это с аннотациями Джексона. Это возможно?
Я следовал этому руководству на случай, если вы захотите его проверить.
USE_ANNOTATIONS
дляObjectMapper
на уровне, где вы обрабатываете запросы на исправление. См. stackoverflow.com/a/57322279/2039546. - person iswailyildiz   schedule 03.01.2021