2010-02-16 7 views
11

Comment puis-je ajouter un objet dans l'en-tête de savon d'un org.springframework.ws.WebServiceMessageAjouter SoapHeader à org.springframework.ws.WebServiceMessage

C'est la structure que je suis à la recherche de se retrouver avec:

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

Répondre

22

Fondamentalement, vous devez utiliser un WebServiceMessageCallback dans votre client pour modifier le message après sa création mais avant qu'il ne soit envoyé. Pour le reste du code a été décrit assez précisément par @skaffman si l'ensemble des choses pourrait ressembler à ceci:

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

Personnellement, je trouve que le printemps-WS suce dur pour un tel besoin de base, ils devraient fixer SWS-479.

+1

Spring-WS est à peu près une opération d'un homme, et Arjen n'est pas tout à fait aussi influençable que le reste d'entre eux: – skaffman

+1

Merci Pascal, ça marche parfaitement. J'ai fini par utiliser javax.xml.bind.util.JAXBSource au lieu de StringSource comme ceci: JAXBSource headerSource = new JAXBSource (jaxbContext, credentials); –

+0

@skaffman En effet :) –

3

Vous devez convertir la WebServiceMessage en SoapMessage, qui a une méthode getSoapHeader() que vous pouvez utiliser pour modifier l'en-tête. À son tour, SoapHeader a diverses méthodes pour ajouter des éléments, y compris getResult() (qui peut être utilisé comme la sortie d'une opération Transformer.transform()).

3

Vous pouvez faire comme ci-dessous:

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; 
} 
} 

Puis

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