7

スーパークラスに一連の共有プロパティを持つオブジェクトがいくつかあります。

public Superclass {
    int id;
    String name;
    ...
}

そして、スーパークラスから継承するサブクラスがありますが、それぞれに完全に記述された独自の @JsonCreator が必要です

public Subclass1 extends Superclass {
    String color;

    @JsonCreator
    public Subclass1(@JsonProperty("id") int id,
                     @JsonProperty("name") String name,
                     @JsonProperty("color") String color)
    {
        super(id, name);
        this.color = color;
    }
}

public Subclass2 extends Superclass {
    int height;

    @JsonCreator
    public Subclass1(@JsonProperty("id") int id,
                     @JsonProperty("name") String name,
                     @JsonProperty("height") int height)
    {
        super(id, name);
        this.height = height;
    }
}

Jackson (2.x) が期待される JSON フィールドに関する情報をスーパークラスから取得し、この繰り返しを回避する方法はありますか?

4

1 に答える 1

2

クラスは不変ではないように見えるため、「id」および「name」プロパティの基本クラスのセッター メソッドに @JsonSetter アノテーションを付けることができます。次に、逆シリアル化によって適切なサブタイプが作成され、コンストラクターの代わりにセッターが使用されます。

public class Superclass {
    private int id;
    private String name;

    @JsonSetter
    public void setId(int id) { ... }

    @JsonSetter
    public void setName(String name) { ... }
}

public Subclass1 extends Superclass {
    private String color;

    @JsonSetter
    public void setColor(String color) { ... }
}

public Subclass2 extends Superclass {
    private int height;

    @JsonSetter
    public void setHeight(int height) { ... }
}

@JsonSubTypes も使用できる場合があります。この注釈はスーパークラスに適用され、各サブタイプ (Subclass1 および Subclass2) への参照をリストする必要があります。これにより、スーパークラスで @JsonCreator を活用して、サブクラスで「id」プロパティと「name」プロパティを繰り返さないようにすることができるかどうかはわかりませんが、試してみる価値があると思います。このアプローチの欠点は、基本クラスにサブタイプへの明示的な参照があることです。

于 2014-01-22T17:33:56.683 に答える