4

我想在派生类中编组一个 XMLAttribute,但我有一些问题。

我有 2 个派生类和 1 个超类,如下所示:

public class Dog extends Animal {

    @XmlAttribute(name = "type")
    private String type;

    @XmlElement
    private String name;
}

public class Cat extends Animal {

    @XmlAttribute(name = "type")
    private String type;

    @XmlElement
    private String name;
}

@XmlSeeAlso({Dog.class, Cat.class})
public class Animal {

}

@XmlRootElement(name="some_element_wrapper")
public SomeElementWrapper() {

    List<Animal> listAnimal;

    @XmlElement(name = "animals")
    public List<Animal> getListAnimal() {}
    public void setListAnimal(List<Animal> listAnimal) {}
}

假设我有一个包含一些数据的列表。我想从我的类中生成 XML,如下所示:

<some_element_wrapper>
    <animals>
        <animal type="dog">....</animal>
        <animal type="cat">....</animal>
    </animals>
</some_element_wrapper>

我的问题是我得到了我想要的,除了类型属性。我尝试了其他不同的解决方案,在超类中移动属性类型,或者覆盖派生类型字段,但没有结果。请问,有什么建议吗?

4

1 回答 1

1

了解JAXBContext子类

JAXB (JSR-222)实现不会自动知道映射类的子类。您要么需要将它们包含在用于引导的类数组中,JAXBContext要么在其中一个映射类上使用@XmlSeeAlso注释。

@XmlSeeAlso(Dog.class, Cat.class)
public class Animal {

}

继承指标

如果您希望使用 type 属性来指定正在使用的子类型,我建议您不要这样做,而是使用xsi:type属性来表示继承在 XML 中的表示方式(使用 XML 和 XML 模式)以及在 JAXB 中的默认表示。

如果您真的不想使用xsi:type属性,则可以利用 anXmlAdaptertype属性用作继承指示符。

EclipseLink JAXB (MOXy)还提供了一个扩展 (@XmlDescrinatorNode/@XmlDescrimatorValue),使这个用例更容易(我是 MOXy 的负责人)。

于 2012-10-22T14:15:00.750 回答