Java 修改JAXB封送器生成的XML头
我目前正在使用以下代码将对象封送到xml字符串中Java 修改JAXB封送器生成的XML头,java,jaxb,Java,Jaxb,我目前正在使用以下代码将对象封送到xml字符串中 JAXBContext context; try { context = JAXBContext.newInstance(heartbeat.getClass()); StringWriter writer = new StringWriter(); Marshaller marshaller = context.createMarshaller(); heart
JAXBContext context;
try {
context = JAXBContext.newInstance(heartbeat.getClass());
StringWriter writer = new StringWriter();
Marshaller marshaller = context.createMarshaller();
heartbeat.setHeader(header);
heartbeat.setHeartbeatEvent(event);
marshaller.marshal(heartbeat, writer);
String stringXML = writer.toString();
return stringXML;
} catch (JAXBException e) {
throw new RuntimeException("Problems generating XML in specified "
+ "encoding, underlying problem is " + e.getMessage(),
e);
}
这将生成以下标题
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
我期望的输出如下
<?xml version=\"1.0\"?>
通过将此添加到封送拆收器
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.FALSE);
marshaller.setProperty("com.sun.xml.bind.xmlHeaders", "<?xml version=\"1.0\"?>");
marshaller.setProperty(marshaller.JAXB_片段,Boolean.FALSE);
setProperty(“com.sun.xml.bind.xmlHeaders”,”;
我收到
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><?xml version="1.0"?>
将JAXB_FRAGMENT属性更改为TRUE将完全删除头。我一直在按照线索试图解决这个问题,但到目前为止我没有运气。有人能告诉我如何从JAXB封送器获取所需的头吗?当使用以下组合封送到
OutputStream
时,会产生预期的输出
marshaller.setProperty("com.sun.xml.bind.xmlHeaders", "<?xml version=\"1.0\"?>");
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
还支持
com.sun.xml.bind.xmlHeaders
,它在编组到编写器时可以正常工作(我是MOXy负责人)
这对我很有效
marshaller.setProperty(“com.sun.xml.internal.bind.xmlHeaders”,
"");代码>
当设置sun
属性时,我得到一个PropertyException
?你用的是哪个版本?不,莫西。我假设该属性与Java实现一起使用,我使用的是Windows上的JDK1.7.0_21。异常发生在javax.xml.bind.helpers.AbstractMarshallerImpl.setProperty(未知源)
的处,以及com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.setProperty(未知源)
的处。Daniel Hári在一篇编辑文章中建议,对于较新的jdk,要设置的属性是“com.sun.xml.internal.bind.xmlHeaders”
“com.sun.xml.internal.bind.xmlHeaders”在使用jdk 1.8中的jaxb时有效(至少在使用java 1.8.0的windows上有效)
JAXBContext context;
try {
context = JAXBContext.newInstance(heartbeat.getClass());
StringWriter writer = new StringWriter();
writer.append("<?xml version=\"1.0\"?>");
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
heartbeat.setHeader(header);
heartbeat.setHeartbeatEvent(event);
marshaller.marshal(heartbeat, writer);
String stringXML = writer.toString();
return stringXML;
} catch (JAXBException e) {
throw new RuntimeException("Problems generating XML in specified "
+ "encoding, underlying problem is " + e.getMessage(),
e);
}