从Superclass继承@JsonCreator注释

时间:2013-07-08 14:00:37

标签: java jackson

我有一些对象在超类中有一组共享属性:

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字段的信息并避免重复?

1 个答案:

答案 0 :(得分:2)

由于您的类似乎不是不可变的,因此可以在基类中为“id”和“name”属性设置@JsonSetter注释。然后反序列化将创建适当的子类型并使用setter而不是构造函数。

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。此批注将在Superclass上进行,您必须列出对每个子类型(Subclass1和Subclass2)的引用。我不知道如果这样可以让你在Superclass中利用@JsonCreator来避免重复子类中的“id”和“name”属性,但我认为值得一试。这种方法的缺点是您的基类具有对子类型的显式引用。