2010-02-16 12 views
11

Come si aggiunge un oggetto nell'intestazione di sapone di un org.springframework.ws.WebServiceMessageAggiungi SoapHeader al org.springframework.ws.WebServiceMessage

Questa è la struttura che sto cercando di finire con:

<soap:Header> 
    <credentials xmlns="http://example.com/auth"> 
     <username>username</username> 
     <password>password</password> 
    </credentials> 
    </soap:Header> 

risposta

22

Fondamentalmente, è necessario utilizzare un WebServiceMessageCallback nel client per modificare il messaggio dopo la sua creazione ma prima che venga inviato. Per resto del codice è stato descritto abbastanza accuratamente dal @skaffman così tutta la roba potrebbe essere simile a questo:

public void marshalWithSoapActionHeader(MyObject o) { 

    webServiceTemplate.marshalSendAndReceive(o, new WebServiceMessageCallback() { 

     public void doWithMessage(WebServiceMessage message) { 
      try { 
       SoapMessage soapMessage = (SoapMessage)message; 
       SoapHeader header = soapMessage.getSoapHeader(); 
       StringSource headerSource = new StringSource("<credentials xmlns=\"http://example.com/auth\">\n + 
         <username>"+username+"</username>\n + 
         <password>"+password"+</password>\n + 
         </credentials>"); 
       Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
       transformer.transform(headerSource, header.getResult()); 
      } catch (Exception e) { 
       // exception handling 
      } 
     } 
    }); 
} 

Personalmente, trovo che la primavera-WS succhia difficile per un bisogno così fondamentale, che dovrebbe risolvere SWS-479.

+1

Primavera-WS è praticamente un one-man operazione, e Arjen non è così suggestionabile come il resto di loro:) – skaffman

+1

Grazie Pascal, funziona perfettamente. Ho finito per utilizzare javax.xml.bind.util.JAXBSource invece di StringSource in questo modo: JAXBSource headerSource = new JAXBSource (jaxbContext, credenziali); –

+0

@skaffman Effettivamente :) –

3

Devi convertire lo WebServiceMessage in SoapMessage, che ha un metodo getSoapHeader() che puoi utilizzare per modificare l'intestazione. A sua volta, SoapHeader ha vari metodi per aggiungere elementi, tra cui getResult() (che può essere utilizzato come output di un'operazione Transformer.transform()).

3

Si può fare di seguito:

public class SoapRequestHeaderModifier implements WebServiceMessageCallback { 
private final String userName = "user"; 
private final String passWd = "passwd"; 

@Override 
public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException { 
    if (message instanceof SaajSoapMessage) { 
    SaajSoapMessage soapMessage = (SaajSoapMessage) message; 
    MimeHeaders mimeHeader = soapMessage.getSaajMessage().getMimeHeaders(); 
    mimeHeader.setHeader("Authorization", getB64Auth(userName, passWd)); 
    } 
} 

private String getB64Auth(String login, String pass) { 
    String source = login + ":" + pass; 
    String retunVal = "Basic " + Base64.getUrlEncoder().encodeToString(source.getBytes()); 
    return retunVal; 
} 
} 

Poi

Object response = getWebServiceTemplate().marshalSendAndReceive(request, new SoapRequestHeaderModifier());