Могу ли я игнорировать свойство только для записи на основе геттера во время десериализации в Java Джексоне? - PullRequest
0 голосов
/ 04 мая 2020

У меня есть устаревший JSON класс API, который я развиваю для удаления определенного свойства. В настоящее время он находится в точке, где значение свойства всегда является одной и той же константой, поэтому я хотел бы, чтобы мой код Java был простым getter без базового поля для него. Я хочу продолжать сериализацию значения, пока не узнаю, что все мои клиенты перешли от использования значения. Объект читается только моими клиентами, поэтому мне не нужно беспокоиться о том, что они отправляют другие значения.

public class MyType {
  private String value;

  public boolean isLegacyValue() {
    return true;
  }
}

Тем не менее, я не хочу, чтобы какой-либо тестовый код или что-либо подобное проваливалось, если Я десериализирую полное значение с помощью свойства now-constant. Есть ли способ, которым я могу сказать Джексону сериализовать свойство только для метода установки, но игнорировать его при десериализации? Я пробовал несколько разных вещей, но я получаю UnrecognizedPropertyException на десериализацию. Я бы предпочел не изменять глобальный DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES только для этого одного свойства.

{"value": "ABC", "legacyValue": true}

Также приемлемым был бы способ указать Джексону включать значение без включения поля Java для него.

Я знаю, что могу добавить геттер в дополнение к своему сеттеру или сделать его полем, но обе эти опции чувствуют, что они путают API Java, так как он фактически не соответствует постоянному ограничению :

public void setLegacyValue(boolean legacyValue) {
    // No-op; only exists for Jackson deserialization
}

Одна вещь, которую я нашел, чтобы работать методом проб и ошибок, - это сделать это последнее поле. По какой-то причине Джексон знает, что обрабатывать это как постоянную только для записи способом, который не работает с геттером без соответствующего установщика. Это будет моим решением, если нет способа сделать это только с помощью геттера.

private final boolean legacyValue = true;

public boolean isLegacyValue() {
    return legacyValue;
}

1 Ответ

1 голос
/ 04 мая 2020

Джексон поддерживает односторонние свойства, используя параметр access, равный @JsonProperty. Аннотируйте вашу собственность так:

@JsonProperty(access = READ_ONLY)
public boolean isLegacyValue() {
    return true;
}
...