【问题标题】:Adding SOAP header elements without namespace添加没有命名空间的 SOAP 标头元素
【发布时间】:2017-04-25 08:52:31
【问题描述】:

我想在 SOAP 信封中添加一个标头元素。我的每次尝试都会引发异常:

com.sun.xml.internal.messaging.saaj.soap.impl.HeaderImpl addHeaderElement SEVERE:SAAJ0131:HeaderElements 必须是命名空间限定的

我只需要在标题内添加一个没有命名空间的简单元素。在这种情况下,我使用了一个处理程序:

public boolean handleMessage(SOAPMessageContext context) {
    try {
        SOAPMessage message = context.getMessage();
        SOAPHeader header = message.getSOAPHeader();
        SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();
        if (header == null) {
            header = envelope.addHeader();
        }
        envelope.addNamespaceDeclaration("gat", "http://schemas.datacontract.org/2004/07/Gateway.Servicios");

        QName passwordQname = header.createQName("Password", "gat");
        QName userQname = header.createQName("User", "gat");

        // Here, I’m trying to add a QName with no namespace.
        QName qNameUserCredentials = new QName(XMLConstants.NULL_NS_URI, "MyHeader");
        SOAPHeaderElement userCredentials = header.addHeaderElement(qNameUserCredentials);

        SOAPHeaderElement password = header.addHeaderElement(passwordQname);
        password.addTextNode(this.password);

        SOAPHeaderElement username = header.addHeaderElement(userQname);
        username.addTextNode(this.username);

        userCredentials.addChildElement(password);
        userCredentials.addChildElement(username);
        message.saveChanges();

        StringWriter writer = new StringWriter();
        message.writeTo(new StringOutputStream(writer));
        System.out.println("SOAP message: \n" + writer.toString());
    } catch (SOAPException e) {
        System.out.println("Error occurred while adding credentials to SOAP header." + e.getMessage());
    } catch (IOException e) {
        System.out.println("Error occurred while writing message to output stream." + e.getMessage());
    }
    return true;
}

预期输出:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:gat="http://schemas.datacontract.org/2004/07/Gateway.Servicios" xmlns:tem="http://tempuri.org/">
    <soapenv:Header>
        <MyHeader>   <-- ######## -->
           <gat:Password>da92767c161e4a62b49f23cb8e712d8e</gat:Password>
            <gat:User>3f3a1850e523fd9961cfa2f4d36bd44d</gat:User>
        </MyHeader>  <-- ######## -->
    </soapenv:Header>
    <soapenv:Body>
        <tem:ConsultarMediosPago>
            <tem:codigoPais>MX</tem:codigoPais>
        </tem:ConsultarMediosPago>
    </soapenv:Body>
</soapenv:Envelope>

元素&lt;MyHeader&gt;&lt;/MyHeader&gt;是我需要添加的。

【问题讨论】:

    标签: java xml web-services soap soapheader


    【解决方案1】:

    这是不可能的,而且故障信息说得很清楚。

    请参阅“SOAP 标头元素”部分的http://www.w3schools.com/XML/xml_soap.asp

    注意: Header 元素的所有直接子元素都必须是命名空间限定的

    【讨论】:

    • 非常感谢!,我认为这是可能的。提到的输出确实是从 SoapUI 生成的,我试图使用 JAX-WS RI 2.2 复制它。 “端点”是使用 .net 3.5 构建的 WFC 服务;这就是该服务接受请求的方式。
    【解决方案2】:

    这应该工作.. 设置 'oasis-200401-wss-wssecurity-secext' 命名空间就可以了。

    import javax.xml.namespace.QName;
    import javax.xml.soap.*;
    QName QUsername = new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Username");
    SOAPHeaderElement usernameElement = soapHeader.addHeaderElement(QUsername);
    usernameElement.addTextNode("user-id-here");
    
    This will give below output
    <Username>user-id-here</Username>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 2010-09-13
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多