47

プロパティのゲッターとセッターを備えたシンプルなインターフェイスがあります。

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

}

私の問題は、お金のプロパティをシリアル化したいが、逆シリアル化中に無視したい、つまり、このプロパティのユーザーからの値を受け入れないことです。セッターで @JsonIgnore を、ゲッターで @JsonIgnore(false) を試しましたが、無視されますが、シリアル化中にも無視されます。

セッターで @JsonIgnore を、ゲッターで @JsonProperty を試して、このプロパティを追跡するつもりであることをジャクソンに明示的に伝えました。マネー プロパティがサーバーに送信され、Jackson がそれをデシリアライズして MalformedJsonException をスローしようとすると、アプリケーションがクラッシュするようです。 Money 型のオブジェクトを作成できません。

最も奇妙なことは、プロパティがプリミティブである場合、ほとんどの場合、セッターに @JsonIgnore を配置し、セッターに @JsonProperty を配置することです。

4

5 に答える 5

29

わかりましたので、@JsonIgnore の動作は 1.9 以降から根本的に変更されました (さらに悪いことに)。逆シリアル化中にプロパティが無視されない理由の悪魔的な詳細に立ち入ることなく、次のコードを試して修正してください。

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など) 。

于 2013-04-15T23:12:26.970 に答える