Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 修改JAXB封送器生成的XML头_Java_Jaxb - Fatal编程技术网

Java 修改JAXB封送器生成的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

我目前正在使用以下代码将对象封送到xml字符串中

    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);
      }