【问题标题】:Why the created XML doesnt conform to standard?为什么创建的 XML 不符合标准?
【发布时间】:2017-05-27 23:49:33
【问题描述】:

根据

http://docs.oracle.com/javaee/5/tutorial/doc/bnbhr.html

SOAPMessage message = messageFactory.createMessage();
SOAPHeader header = message.getSOAPHeader();
SOAPBody body = message.getSOAPBody();

这是它生成的 XML:

<SOAP-ENV:Envelope
 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header/>
  <SOAP-ENV:Body>
    ...
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

但我的实现会产生类似的 XML 代码

<SOAP-ENV:Envelope
 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Body>
    ...
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

没有&lt;SOAP-ENV:Header/&gt; 标签。即使它是空的,我也需要明确的标题标签。我怎样才能生成这样的 XML。

这是我的代码

MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage message = messageFactory.createMessage();
SOAPHeader header = message.getSOAPHeader();



marshaller.marshal(someObject, message.getSOAPBody());
message.saveChanges();
return message; //save it as request. for printing in logs

我用

ByteArrayOutputStream in = new ByteArrayOutputStream();
request.writeTo(in);
logger.debug("Sending: " + in);

在我的控制台上打印它。

【问题讨论】:

  • 标头在规范中是可选的。如果你需要它——你不应该——你将不得不在那里放置一个非空白空间或其他东西。
  • 您能解释一下如何回答吗? @stdunbar

标签: java xml saaj


【解决方案1】:

好吧,现在我无法重现您所看到的内容。我正在使用 SAAJ 1.3.28,我的代码如下所示。我看到即使标题中没有任何内容,我也得到了 SOAP 标题。您可以在下面看到,我尝试在标题中添加一些内容 - 我最近显然没有这样做,因为我的评论是错误的。我以两种不同的方式打印出 SOAP 消息,并以两种方式显示标题。您使用的是哪个版本的 SAAJ?

供参考,我的第二种消息打印方法来自this stackoverflow post

package com.hotjoe.stuff;


import java.io.ByteArrayOutputStream;
import java.io.IOException;

import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.stream.StreamResult;

public class MessageCreator {

    public static void main(String[] argv) {
        try {
            MessageFactory factory = MessageFactory.newInstance();
            SOAPMessage message = factory.createMessage();

            SOAPBody body = message.getSOAPBody();
            QName bodyName = new QName("http://wombat.ztrade.com", "GetLastTradePrice", "m");
            SOAPBodyElement bodyElement = body.addBodyElement(bodyName);

            QName name = new QName("symbol");
            SOAPElement symbol = bodyElement.addChildElement(name);
            symbol.addTextNode("SUNW");

//            SOAPHeader header = message.getSOAPHeader();
//            QName headerName = new QName("http://wombat.ztrade.com","headerItem", "m");
//            header.addHeaderElement(headerName);

            ByteArrayOutputStream out = new ByteArrayOutputStream();
            message.writeTo(out);
            String strMsg = new String(out.toByteArray());

            System.out.println( "message is " + strMsg );

            System.out.println( "or another way " + printSoapMessage(message) );
        }
        catch( SOAPException | IOException | TransformerException se ) {
            se.printStackTrace();
        }
    }

    public static String printSoapMessage(final SOAPMessage soapMessage) throws TransformerFactoryConfigurationError,
            SOAPException, TransformerException
    {
        final TransformerFactory transformerFactory = TransformerFactory.newInstance();
        final Transformer transformer = transformerFactory.newTransformer();

        // Format it
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");

        final Source soapContent = soapMessage.getSOAPPart().getContent();

        final ByteArrayOutputStream streamOut = new ByteArrayOutputStream();
        final StreamResult result = new StreamResult(streamOut);
        transformer.transform(soapContent, result);

        return streamOut.toString();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-13
    • 2011-01-19
    • 2011-04-16
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    相关资源
    最近更新 更多