【问题标题】:JAXB abstract class with @XmlTransient带有@XmlTransient 的 JAXB 抽象类
【发布时间】:2013-09-01 23:55:18
【问题描述】:

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

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

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

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

JAXB 抱怨我试图访问/返回两个同名字段。

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

提前致谢!

【问题讨论】:

    标签: java xml jaxb deserialization


    【解决方案1】:

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

    Java 模型

    Foo

    您可以使用@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"/>
    

    【讨论】:

    • 嗨,布莱斯。感谢您的回复(实际上我从您的博客中得到了@XMLTransient ;)无论如何,我认为这可能会奏效,并且真的很害怕这将是唯一的解决方法。问题是我的抽象类相当大。不仅如此,我还继承了两个大型抽象类。 :/ 感谢您的宝贵时间
    猜你喜欢
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多