JAXB继承 - 非抽象基类

时间:2014-02-20 16:35:31

标签: java xml inheritance jaxb

我目前正在尝试使用JaxB但是我用一个相对简单的例子并不是很成功。我的例子如下:

public class A {
   private String m_name;
}

public abstract class B_Base extends A {

}

public class B1 extends B_Base {
   private String m_value1;
}

public class B2 extends B_Base {
   private String m_value2;
}

我所有的尝试(甚至是编组)都失败了。我查看了Blaise Doughan的博客,其中包括http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-xsitype.html等文章,但它们似乎都没有对我的例子有所帮助。我当然可能误用了他的例子。在我看来,我的例子应该是JaxB中容易支持的东西 - 毕竟,java主要基于继承关系!

我很感激快速反应!

1 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

  • JAXB将引入超类,但不是子类。您可以在叶类上创建JAXBContext,也可以在父类上使用@XmlSeeAlso注释来引入子类。
  • 您需要提供根元素信息。下面我用JAXBElement
  • 完成了这项工作

<强>演示

import javax.xml.bind.*;
import javax.xml.namespace.QName;

public class Demo {

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

        B1 b1 = new B1();
        JAXBElement<A> jaxbElement = new JAXBElement<A>(new QName("root"), A.class, b1);

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

}

<强>输出

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

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b1"/>

更新

  嗨,可能是一个非常愚蠢的问题,但只是想知道,我怎么样   如果我有一个包含A对象的ArrayList的类C,请调整它   (或子类)?

Java模型

<强> C

以下是评论中描述的C课程:

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class C {

    private List<A> as = new ArrayList<A>();

    @XmlElement(name="a")
    public List<A> getAs() {
        return as;
    }

}

<强> A

以下是如何利用@XmlSeeAlso注释引入子类。

@XmlSeeAlso({ B1.class, B2.class })
public class A {
    private String m_name;
}

演示代码

下面是一些显示一切正常的演示代码。现在注意我们使用@XmlSeeAlso我们使用@XmlSeeAlso我们在引导JAXBContext时不需要包含子类。

<强>演示

import javax.xml.bind.*;

public class Demo {

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

        C root = new C();
        root.getAs().add(new B1());
        root.getAs().add(new B2());

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

}

<强>输出

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

<?xml version="1.0" encoding="UTF-8"?>
<c>
    <a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b1"/>
    <a xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b2"/>
</c>