如何获取JAXB对象的命名空间

Chr*_*ris 6 java namespaces jaxb

目前,我正在使用以下代码将JAXB对象编组为输出流

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
ByteArrayOutputStream out = new ByteArrayOutputStream();
marshaller.marshal(new JAXBElement(new QName("hard_coded_namespace", clazz.getSimpleName()), clazz, obj), out);
Run Code Online (Sandbox Code Playgroud)

我想将"hard_coded_namespace"替换为JAXB"obj"中包含的命名空间(或者它的一个属性,它们当前应该共享相同的NS).

任何想法如何在编组之前获得NS信息?在输出流中,将显示命名空间.所以他们在"obj"的某个地方.

[更新]正如下面的答案所指出的,我不需要设置JAXB_FRAGMENT属性.我改成了:

    JAXB.marshal(new JAXBElement<T>(new QName("hard_coded_namespace", rootName), clazz, jaxbObject), out);
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 4

目前,这是我找到的解决方案:

    String nsURI = "";
    for(Annotation annotation: jaxbObject.getClass().getPackage().getAnnotations()){
        if(annotation.annotationType() == XmlSchema.class){
            nsURI = ((XmlSchema)annotation).namespace();
            break;
        }
    }
Run Code Online (Sandbox Code Playgroud)

欢迎更优雅的解决方案:-)