關於@XmlSeeAlso
的@XmlSeeAlso
註解的目的只是爲了讓你的JAXB(JSR-222)實現知道,當它正在處理元數據Resource
,它也應處理爲SomeItem
元數據類。有些人錯誤地認爲它與映射繼承有關,因爲它是最經常使用的用例。由於無法使用Java反射確定類的子類,因此使用@XmlSeeAlso
來讓JAXB實現知道也應該創建子類的映射。
下面是你如何能支持您的使用情況的一個例子:
資源
對應一個Java類的複雜類型名稱通過@XmlType
註釋提供。
package forum12288631;
import javax.xml.bind.annotation.XmlType;
@XmlType(name="some_item")
public class Resource {
}
演示
根元素名稱可以來自@XmlRootElement
註釋,或者可以經由的JAXBElement
一個實例來提供。我們將創建一個JAXBElement
的實例,並指出它正在持有Object
的實例。在編組時,將會在輸出中包含xsi:type
屬性。
package forum12288631;
import javax.xml.bind.*;
import javax.xml.namespace.QName;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Resource.class);
Resource resource = new Resource();
JAXBElement<Object> jaxbElement = new JAXBElement<Object>(QName.valueOf("resource"), Object.class, resource);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(jaxbElement, System.out);
}
}
輸出
生成的XML具有由JAXBElement
和xsi:type
屬性的值提供的根元素來源於@XmlType
註釋上Resource
。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="some_item"/>