8

在参考 JAXB 实现中是否有让 XmlSeeAlso 使用来自 XmlRootElement 的 name= 值?

我想要的效果是让 type 属性使用 name= 值而不是 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>

不费吹灰之力就可以吗?

4

1 回答 1

12

关于@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"/>
于 2012-09-05T20:23:07.117 回答