Использование аннотаций Джексона с JsonPatch

Если у меня есть следующий 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 в контроллере, чтобы проверять каждую операцию исправления и игнорировать ее, если она пытается изменить поле, которое я хочу сделать доступным только для чтения, например возраст, но я бы предпочел сделать это с аннотациями Джексона. Это возможно?

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


person David de Castro    schedule 03.01.2021    source источник
comment
Вы можете отключить функцию USE_ANNOTATIONS для ObjectMapper на уровне, где вы обрабатываете запросы на исправление. См. stackoverflow.com/a/57322279/2039546.   -  person iswailyildiz    schedule 03.01.2021
comment
Извините, но не могли бы вы рассказать об этом подробнее, я просто не понимаю, как это решает мою проблему, так как я хочу использовать обозначения, а не отключать их.   -  person David de Castro    schedule 04.01.2021