我有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属性,我得到了我想要的东西.我尝试了其他不同的解决方案,在超类中移动属性类型,或覆盖派生类型字段,但没有结果.
请问,有什么建议吗?
解决方法
JAXB (JSR-222)实现不会自动识别映射的类子类.您需要将它们包含在用于引导JAXBContext的类数组中,或者在其中一个映射类上使用@XmlSeeAlso注释.
@XmlSeeAlso(Dog.class,Cat.class) public class Animal { }
继承指标
如果您希望使用type属性来指定正在使用的子类型,我建议不要这样做并使用xsi:type属性,而不是在XML中使用XML(XML和XML模式)表示继承的方式和默认表示在JAXB中.
> http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-xsitype.html
如果您确实不想使用xsi:type属性,则可以利用XmlAdapter将type属性用作继承指示符.
> http://blog.bdoughan.com/2012/01/jaxb-and-inhertiance-using-xmladapter.html
EclipseLink JAXB (MOXy)还提供了一个扩展(@ XmlDescrinatorNode / @ XmlDescrimatorValue),使这个用例更容易(我是MOXy领导者).
> http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-moxy-extension.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。