2

How can I add empty xmlns="" tag to header elements?
Let's imagine we have same project in two servers.
In this project I used the below SOAPHandler.
First server send request with empty xmlns="" tag
<username xmlns="">test</username><password xmlns="">test</password>
, but second server send request without xmlns="" tag.
<username>test</username><password>test</password>
I need xmlns="" tag in every servers.
How can I solve this problem?

import java.util.Collections;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
import org.apache.log4j.Logger;

/**
 *
 * @author BashirovMA
 */
public class MyHandler implements SOAPHandler<SOAPMessageContext> {

    static final Logger log = Logger.getLogger(MyHandler.class);
    private String username;
    private String password; 

    public MyHandler() {
        this.username = "";
        this.password = ""; 
    }

    public MyHandler(String username, String password) {
        this.username = username;
        this.password = password; 
    }

    public MyHandler(String username, String password) {
        this.username = username;
        this.password = password;
    }

    @Override
    public boolean handleMessage(SOAPMessageContext smc) {
        SOAPMessage msg = smc.getMessage();
        Boolean outboundProperty = (Boolean) smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

        if (outboundProperty.booleanValue()) {
            try {
                SOAPEnvelope envelope = smc.getMessage().getSOAPPart().getEnvelope();
                if (envelope.getHeader() != null) {
                    envelope.getHeader().detachNode();
                }
                SOAPHeader header = envelope.addHeader();
                SOAPElement root = header.addHeaderElement(envelope.createName("messageHeader", "", "http://services.ws.com/"));
                SOAPElement el1 = root.addChildElement(envelope.createName("username", "", ""));
                el1.setValue(String.valueOf(username));
                SOAPElement el2 = root.addChildElement(envelope.createName("password", "", ""));
                el2.setValue(String.valueOf(password)); 
                msg.saveChanges();  

            } catch (Exception e) {
                e.printStackTrace();
                log.error(e);
            }
        } else {
            try {
                SOAPMessage message = smc.getMessage();
                message.writeTo(System.out);
            } catch (Exception ex) {
                ex.printStackTrace();
                log.error(ex);
            }
        }
        return true;
    }

    @Override
    public Set<QName> getHeaders() {
        return null;
    }

    @Override
    public boolean handleFault(SOAPMessageContext messageContext) {
        return true;
    }

    @Override
    public void close(MessageContext context) {
    }

}
MehmanBashirov
  • 641
  • 1
  • 7
  • 15
  • This problem happened for JDK versions. When I used JKD 1.7 version I got this problem. Problem resolved when I change JDK version 1.7 to 1.8 . I couldn't find any solution for jdk versions and I use HTTP POST for WSDL. – MehmanBashirov Jan 31 '18 at 07:38

0 Answers0