如何获得XmlType#name的有效默认值?

时间:2014-10-31 01:40:57

标签: java xml jaxb jaxb2

在我的测试实用程序代码中,我打印了这样的XML内容。

public static <T> void printXml(final Class<T> type, final T instance)
    throws JAXBException {

    final JAXBContext context = JAXBContext.newInstance(type);

    final Marshaller marshaller = context.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

    if (type.getAnnotation(XmlRootElement.class) == null) {
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
        final XmlType xmlType = type.getAnnotation(XmlType.class);
        // xmlType.name() -> "##default"
        marshaller.marshal(
            new JAXBElement<>(new QName(xmlType.namespace(),
                                        xmlType.name()), type, instance),
            System.out);
        return;
    }

    marshaller.marshal(instance, System.out);
}

@XmlRootElement的类型工作正常。

但是当我尝试打印一个没有@XmlRootElement的类型时,我得到了这个。

<##default xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="...">
...
</##default>

xmlns部分没问题。 marshaller找到了我想要的namespaceUri。

问题是,请参阅##default?,如何找到名称部分?

我想要这个。

<someName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="...">
...
</someName>

1 个答案:

答案 0 :(得分:2)

如果未在注释中指定名称,则默认为##default。要处理这种情况,您需要执行JAXB impls所做的操作,并将JSR-222规范中定义的算法应用于短类名以获取名称。