2

当 XML 是从子类中构造出来时,父类中是否可能没有很少的字段?但是当从父类构造 XML 时元素应该存在吗?

例子

家长班

    @XmlRootElement(name = "location")
    @XmlType(propOrder = { "id", "name" })
    @JsonPropertyOrder({ "id", "name" })
    public class Parent {

    private Integer id;
    private String name;

    @XmlElement(name = "id", nillable = true)
    @JsonProperty("id")
    public Integer getId() {
        return super.getId();
    }

    @JsonProperty("id")
    public void setId(Integer id) {
        super.setId(id);
    }

    @XmlElement(name = "name", nillable = true)
    @JsonProperty("name")
    public String getName() {
        return name;
    }

    @JsonProperty("name")
    public void setName(String name) {
        this.name = name;
    }
}

Child class

@XmlRootElement(name = "location")
@XmlType(propOrder = { "id" })
@JsonPropertyOrder({ "id" })
public class Child extends Parent {

    @XmlElement(name = "id", nillable = true)
    @JsonProperty("id")
    public Integer getId() {
        return super.getId();
    }

    @JsonProperty("id")
    public void setId(Integer id) {
        super.setId(id);
    }
}

从子类构造 XML 时,我不想要名称字段。但是,当从父类构造 XML 时,它应该存在。

4

1 回答 1

0

尝试覆盖子类中的 getter 和 setter并用and/orname注释它们。@JsonIgnore@XmlTransient

编辑

确实,@XmlTransient不能像我预期的那样(和那样@JsonIgnore)使用多态性。你可以尝试的是:

-- 将类的所有内容移动Parent到一个抽象Base类 -- 标记Base@XmlTransient -- make ParentextendBase并且不添加任何内容 -- make ChildextendBase

这是我研究的一些综合示例。它可以很容易地翻译成您的特定课程。

班级Base

@XmlRootElement(name = "location")
@XmlSeeAlso(value = {Parent.class, Child.class})
@XmlTransient
public abstract class Base {
private String a;
private String b;

@XmlElement(name = "a")
public String getA() {
    return a;
}
public void setA(String a) {
    this.a = a;
}

@XmlElement(name = "b", nillable = true)
public String getB() {
    return b;
}
public void setB(String b) {
    this.b = b;
}
}

班级Parent

@XmlRootElement(name = "location")
@XmlType
public class Parent extends Base {

}

班级Child

@XmlRootElement(name = "location")
@XmlType
public class Child extends Base {
private String c;

@XmlElement(name = "c")
public String getC() {
    return c;
}

public void setC(String c) {
    this.c = c;
}

@Override
@XmlTransient
public String getB(){
    return super.getB();
}

@Override
public void setB(String b) {
    super.setB(b);
}

}

显然,如果类层次结构变得更大,可能更难维护这样的解决方法。在这些情况下,您可能会考虑选择组合而不是继承。

于 2013-11-14T00:40:20.943 回答