我想在派生类中编组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) {}
}
假设我有一个填充了一些数据的List。 我想从我的类生成XML,如下所示:
<some_element_wrapper>
<animals>
<animal type="dog">....</animal>
<animal type="cat">....</animal>
</animals>
</some_element_wrapper>
我的问题是,除了type属性,我得到了我想要的东西。我尝试了其他不同的解决方案,在超类中移动属性类型,或覆盖派生类型字段,但没有结果。 请问,有什么建议吗?
答案 0 :(得分:1)
让JAXBContext
了解子类
JAXB (JSR-222)实现不会自动识别映射的类子类。您需要将它们包含在用于引导JAXBContext
的类数组中,或者在其中一个映射类上使用@XmlSeeAlso
注释。
@XmlSeeAlso(Dog.class, Cat.class)
public class Animal {
}
继承指标
如果您希望使用type属性来指定正在使用的子类型,我建议不要这样做,而是使用xsi:type
属性,而不是在XML中表示继承的方式(使用XML和XML模式) )和JAXB中的默认表示。
如果您确实不想使用xsi:type
属性,则可以利用XmlAdapter
使用type
属性作为继承指示符。
EclipseLink JAXB (MOXy)还提供了一个扩展程序(@XmlDescrinatorNode
/ @XmlDescrimatorValue
),使这个用例更容易(我是MOXy的主管)。