关于@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"/>