带有@XmlTransient的JAXB抽象类

时间:2013-08-29 13:48:40

标签: java xml jaxb deserialization

我正在使用JAXB将一些xml解组为一个对象。

我有一个继承自抽象类的类。我将抽象类标记为@XmlTransient。然后使用XMLType PropOrder,我可以访问抽象类中的属性,如下所示:

@XmlType( propOrder = { "id"...

冷却。问题有时它不是我想要访问的元素而是属性。通常,您将使用@XMLAttribute定义此类属性,以指示该值存储在xml属性中而不是元素中。但鉴于我已经在定义了'id'的抽象类上使用了XMLTransient,当我尝试将该字段标记为@XMLAttribute时,JAXB会抱怨。

JAXB抱怨我正在尝试访问/返回两个具有相同名称的字段。

任何人都可以指出我正确的方向吗?我正在为GAE构建,所以我真的不想使用任何其他库。

提前致谢!

1 个答案:

答案 0 :(得分:2)

以下是您可以做的几件事:

Java模型

<强>富

您可以使用@XmlAttribute在父类上注释属性。

import javax.xml.bind.annotation.*;

@XmlTransient
public class Foo {

    private String att1;
    private String att2;

    @XmlAttribute
    public String getAtt1() {
        return att1;
    }

    public void setAtt1(String att1) {
        this.att1 = att1;
    }

    public String getAtt2() {
        return att2;
    }

    public void setAtt2(String att2) {
        this.att2 = att2;
    }

}

<强>酒吧

您可以覆盖子类上的属性,并使用@XmlAttribute注释它。

import javax.xml.bind.annotation.*;

@XmlRootElement
public class Bar extends Foo {

    @Override
    @XmlAttribute
    public String getAtt2() {
        return super.getAtt2();
    }

    @Override
    public void setAtt2(String att2) {
        super.setAtt2(att2);
    }

}

演示代码

<强>演示

以下是一些可以运行的演示代码,以显示一切正常。

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Bar.class);

        Bar bar = new Bar();
        bar.setAtt1("a");
        bar.setAtt2("b");

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(bar, System.out);
    }

}

<强>输出

以下是运行演示代码的输出:

<?xml version="1.0" encoding="UTF-8"?>
<bar att1="a" att2="b"/>