在引用JAXB实现中,无论如何都要让XmlSeeAlso使用XmlRootElement中的name = value?
我想要的效果是type属性使用name = value而不是XmlSeeAlso中的实际类名。
这可能是其他一些JAXB实现吗?
小例子:
@XmlRootElement(name="some_item")
public class SomeItem{...}
@XmlSeeAlso({SomeItem.class})
public class Resource {...}
XML:
<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="some_item">
...
</resource>
可能没有多少努力?
答案 0 :(得分:11)
关于@XmlSeeAlso
@XmlSeeAlso
注释的目的只是让您的JAXB(JSR-222)实现知道在处理Resource
的元数据时它还应该处理{{SomeItem
的元数据。 1}}类。有些人错误地认为它与映射继承有关,因为这是最常用的用例。由于无法使用Java反射确定类的子类,因此使用@XmlSeeAlso
来让JAXB实现知道也应该创建子类的映射。
以下是如何支持您的用例的示例:
<强>资源强>
通过@XmlType
注释提供与Java类对应的复杂类型名称。
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"/>