Игнорирование свойства при десериализации
У меня есть простой интерфейс с getter и setter для свойства.
public interface HasMoney {
Money getMoney();
void setMoney(Money money);
}
У меня есть еще один класс UserAccount, который реализует этот интерфейс.
public class UserAccount implements HasMoney {
private Money money;
@Override
Money getMoney() // fill in the blanks
@Override
void setMoney(Money money) // fill in the blanks
}
Моя проблема в том, что я хочу сериализовать свойство money, но игнорирую его при десериализации, т.е. не принимаю никаких значений от пользователя для этого свойства. Я попытался @JsonIgnore на setter и @JsonIgnore (false) на getter, он игнорирует его, но он делает это, одновременно сериализуя его.
Я попробовал @JsonIgnore на сеттер и @JsonProperty на получателе, чтобы прямо сказать Джексону, что мы намерены отслеживать это свойство, которое, похоже, разбивает приложение, когда денежное свойство отправляется на сервер, и Джексон пытается десериализовать его бросание up MalformedJsonException: невозможно создать объект типа Money.
Самое странное, что включение @JsonIgnore в сеттер и @JsonProperty в сеттер работает в большинстве случаев, когда свойство является примитивным.
Ответы
Ответ 1
Хорошо, поэтому поведение @JsonIgnore было радикально изменено с 1,9 года (в худшем случае imo). Не вдаваясь в дьявольские детали, почему ваша собственность не игнорируется во время десериализации, попробуйте этот код, чтобы исправить ее:
public class UserAccount implements HasMoney {
@JsonIgnore
private BigDecimal money;
// Other variable declarations, constructors
@Override
@JsonProperty
public BigDecimal getMoney() {
return money;
}
@JsonIgnore
@Override
public void setMoney(final BigDecimal money) {
this.money = money;
}
// Other getters/setters
}
Обратите внимание на использование @JsonIgnore
в переменной класса - его необходимо для рабочего решения.
Примечание. В зависимости от вашей среды и используемого варианта вам может потребоваться дополнительная настройка в экземпляре ObjectMapper, например USE_GETTERS_AS_SETTERS, AUTO_DETECT_GETTERS, AUTO_DETECT_SETTERS и т.д.
Ответ 2
Версия 2.6.0+ позволяет это делать с помощью @JsonIgnoreProperties на уровне класса.
@JsonIgnoreProperties(value={ "money" }, allowGetters=true)
Взгляните на этот закрытый вопрос:
https://github.com/FasterXML/jackson-databind/issues/95