0

According to

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

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

Here is the XML it produces:

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

But my Implementation produces XML code like

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

without the <SOAP-ENV:Header/> tag. I need the header tag explicitly even if it is empty. How can I produce such XML.

Here is my code

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

I use

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

to print it on my console.

Mohamed Anees A
  • 4,119
  • 1
  • 22
  • 35

1 Answers1

0

Well, now I can't reproduce what you're seeing. I'm using SAAJ 1.3.28 and my code looks like below. I see that I'm getting the SOAP header even without anything in the header. You can see below that I went down the path of trying to put something in the header - I obviously haven't done this recently enough because my comment was wrong. I print out the SOAP message two different ways and it shows the header both ways. What version of SAAJ are you using?

For reference, my second message printing method came from 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();
    }
}
Community
  • 1
  • 1
stdunbar
  • 16,263
  • 11
  • 31
  • 53