目前,我正在使用以下代码将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);我想将"hard_coded_namespace“替换为JAXB "obj”中包含的名称空间(或者它的一个属性,它们目前应该共享相同的NS)。
有什么办法在编组前获取NS信息吗?在输出流中,将出现命名空间。所以他们在"obj“中的某个地方。
更新正如下面的答案所指出的,我不需要设置JAXB_FRAGMENT属性。我将其更改为:
JAXB.marshal(new JAXBElement<T>(new QName("hard_coded_namespace", rootName), clazz, jaxbObject), out);发布于 2012-06-11 22:36:34
现在,这是我找到的解决方案:
String nsURI = "";
for(Annotation annotation: jaxbObject.getClass().getPackage().getAnnotations()){
if(annotation.annotationType() == XmlSchema.class){
nsURI = ((XmlSchema)annotation).namespace();
break;
}
}欢迎更优雅的解决方案:-)
发布于 2012-06-10 09:03:30
您需要使用marshal API吗?有一个更简单的重载。只要obj的运行时类具有注释@XmlRootElement,您就应该能够简单地调用
marshaller.marshal(obj, out);发布于 2012-06-11 22:17:03
使用Marshaller.JAXB_FRAGMENT属性实际上与处理非根元素没有任何关系。它充当一个标志,用于确定是否应该限制某些封送处理事件。例如,如果设置了该属性,则不会生成开始和结束文档事件。
我还没有对以下内容进行测试,但这里是关于如何创建一些实用程序代码来查找给定JAXB对象的QName的基本想法:
反射如果JAXBIntrospector.isElement返回true,则只需使用JAXBIntrospector.getElementName.
ObjectFactory对象相同的包中查找ObjectFactory类上的方法,该方法返回JAXBElement并接受单个参数,该参数是与JAXB对象属于同一类的实例。调用该方法,然后使用JAXBElement.getName.https://stackoverflow.com/questions/10950857
复制相似问题