2017-06-19 1 views
0

Brauchen Sie einen SOAP-Dienst, deren Anforderungsstruktur aussehen wie untenErstellen von benutzerdefinierter Kopfzeile mit Spring Integration

Im Frühjahr integartion treffen wir können die Lage, den Körperteil zu bilden und den Service zu treffen und die Antwort zu bekommen.

<?xml version="1.0"?> 

<soap:Envelope 
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/" 
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> 

<soap:Header> 
<m:Trans xmlns:m="https://www.w3schools.com/transaction/"soap:mustUnderstand="1">234 
</m:Trans> 
<authheader> 
    <username> uname</username> 
    <password>password</password> 
</authheader> 
</soap:Header> 

<soap:Body xmlns:m="http://www.example.org/stock"> 
    <m:GetStockPriceResponse> 
    <m:Price>34.5</m:Price> 
</m:GetStockPriceResponse> 
</soap:Body> 

Aber wie das Kopfteil zusammen mit Körper zu bilden und es in Outbound-Gateway senden?

Könnte jemand helfen?

Antwort

1

Ab Version 5.0 unterstützt die DefaultSoapHeaderMapper benutzerdefinierte Header vom Typ javax.xml.transform.Source und füllt sie als untergeordneter Knoten der <soapenv:Header>:

Map<String, Object> headers = new HashMap<>(); 

String authXml = 
    "<auth xmlns='http://test.auth.org'>" 
      + "<username>user</username>" 
      + "<password>pass</password>" 
      + "</auth>"; 
headers.put("auth", new StringSource(authXml)); 
... 
DefaultSoapHeaderMapper mapper = new DefaultSoapHeaderMapper(); 
mapper.setRequestHeaderNames("auth"); 

Und am Ende haben wir SOAP-Umschlag als:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Header> 
     <auth xmlns="http://test.auth.org"> 
      <username>user</username> 
      <password>pass</password> 
     </auth> 
    </soapenv:Header> 
    <soapenv:Body> 
     ... 
    </soapenv:Body> 
</soapenv:Envelope> 

Wenn Sie noch nicht 5.0 Frühling Integration verwenden können, können Sie seine logi ausleihen c auf die Frage von der DefaultSoapHeaderMapper für benutzerdefinierte Erweiterung dieser Klasse:

protected void populateUserDefinedHeader(String headerName, Object headerValue, SoapMessage target) { 
    SoapHeader soapHeader = target.getSoapHeader(); 
    if (headerValue instanceof String) { 
     QName qname = QNameUtils.parseQNameString(headerName); 
     soapHeader.addAttribute(qname, (String) headerValue); 
    } 
    else if (headerValue instanceof Source) { 
     Result result = soapHeader.getResult(); 
     try { 
      this.transformerHelper.transform((Source) headerValue, result); 
     } 
     catch (TransformerException e) { 
      throw new SoapHeaderException(
        "Could not transform source [" + headerValue + "] to result [" + result + "]", e); 
     } 
    } 
}