XmlSeeAlso和XmlRootElement名称?

时间:2012-09-05 19:43:01

标签: jaxb

在引用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>

可能没有多少努力?

1 个答案:

答案 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"/>