2

如何将空 xmlns="" 标记添加到标题元素?
假设我们在两台服务器上有相同的项目。
在这个项目中,我使用了下面的 SOAPHandler。
第一个服务器发送带有空 xmlns="" 标签
<username xmlns="">test</username><password xmlns="">test</password>
的请求,但第二个服务器发送没有 xmlns="" 标签的请求。
<username>test</username><password>test</password>
我在每台服务器中都需要 xmlns="" 标记。
我怎么解决这个问题?

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

}
4

0 回答 0