在参考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>
Run Code Online (Sandbox Code Playgroud)
可能没有太多的努力?
bdo*_*han 11
关于 @XmlSeeAlso
@XmlSeeAlso注释的目的只是让您的JAXB(JSR-222)实现知道在处理元数据时Resource它还应该处理SomeItem类的元数据.有些人错误地认为它与映射继承有关,因为这是最常用的用例.由于无法使用Java反射确定类的子类,@XmlSeeAlso因此用于让JAXB实现知道还应创建子类的映射.
以下是如何支持您的用例的示例:
资源
通过@XmlType注释提供与Java类对应的复杂类型名称.
package forum12288631;
import javax.xml.bind.annotation.XmlType;
@XmlType(name="some_item")
public class Resource {
}
Run Code Online (Sandbox Code Playgroud)
演示
根元素名称可以来自@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);
}
}
Run Code Online (Sandbox Code Playgroud)
产量
生成的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"/>
Run Code Online (Sandbox Code Playgroud)