如何忽略父类中的JAXB注释属性?

时间:2012-10-01 11:52:33

标签: jaxb marshalling

我们在一个属性上有一个带有JAXB注释的类。然后,我们有几个子类,用于注释其余的重要数据。但是,我们有一个子类,我们想要忽略父类注释,以便它不会被编组。这是一些示例代码。

家长班:

@XmlType(name="Request")
@XmlAccessorType(XmlAccessorType.NONE)
public abstract class Request {
    @XmlElement(required=true)
    private UUID uuid;

    ... setter/getter
}

现在为子类:

@Xsd(name="concreteRequest")
@XmlRootElement("ConcreteRequest")
@XmlType(name="ConcreteRequest")
@XmlAccessorType(XmlAccessorType.FIELD)
public class ConcreteClass {
    @XmlElement(required=true)
    private String data1;
    @XmlElement(required=true)
    private String data1;

    ... setters/getters ...
}

当我编写ConcreteClass的实例时,我得到以下XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ConcreteRequest>
    <uuid>uuid</uuid>
    <data1>data</data1>
    <data2>data</data3>
</ConcreteRequest>

我想要这样的XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ConcreteRequest>
    <data1>data</data1>
    <data2>data</data3>
</ConcreteRequest>

我们有其他的Request实现,但是确实需要UUID,这只是一个特例。有没有办法忽略我的ConcreteRequest中的UUID字段?

2 个答案:

答案 0 :(得分:7)

我希望,我理解你的问题。这是解决方案。

JAXB在编组期间提供@XmlTransient(javax.xml.bind.annotation.XmlTransient) (javadoc)来忽略任何字段。

在派生类(ConcreteRequest.class)中将字段“uuid”重写为 @XmlTransient 及其对应的Getter / Setter方法。有必要覆盖Getter / Setter方法,这些方法将在编组期间调用。

@Xsd(name="concreteRequest")
@XmlRootElement("ConcreteRequest")
@XmlType(name="ConcreteRequest")
@XmlAccessorType(XmlAccessorType.FIELD)
public class ConcreteClass {
    @XmlElement(required=true)
    private String data1;
    @XmlElement(required=true)
    private String data2;
    @XmlTransient
    private UUID uuid;

    ... setters/getters ...
}

这将覆盖您的基类属性。

请与我联系以获取更多信息。

答案 1 :(得分:0)

您可以使用

var bag = [];
{
for (i=0; i<bag.length; i++) {
    bag.push([i] === "peanuts");
    }
}

在父类上,

@XmlAccessorType(XmlAccessType.NONE)

关于派生类。