Подтвердить что ты не робот

Игнорирование свойства при десериализации

У меня есть простой интерфейс с 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 в сеттер работает в большинстве случаев, когда свойство является примитивным.

4b9b3361

Ответ 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