从child构造XML时,不要包含很少的父类元素

时间:2013-11-14 00:25:36

标签: jaxb

当从子类构造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时,它应该存在。

1 个答案:

答案 0 :(得分:0)

尝试覆盖子类中name的getter和setter,并使用@JsonIgnore和/或@XmlTransient对其进行注释。

修改

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

- 将Parent类的所有内容移动到抽象Base类 - 将Base标记为@XmlTransient - 使Parent扩展Base并向其添加任何内容 - 使Child延长Base

这是我工作的一些合成例子。它可以很容易地翻译成您的特定类。

班级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);
}

}

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