Добавьте SoapHeader в org.springframework.ws.WebServiceMessage - PullRequest
13 голосов
/ 16 февраля 2010

Как я могу добавить объект в мыльный заголовок org.springframework.ws.WebServiceMessage

Это структура, с которой я собираюсь закончить:

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

Ответы [ 4 ]

29 голосов
/ 16 февраля 2010

Как правило, вам нужно использовать WebServiceMessageCallback в вашем клиенте, чтобы изменить сообщение после его создания, но до его отправки. Остальная часть кода была довольно точно описана @skaffman, поэтому весь материал может выглядеть так:

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

Лично я нахожу, что Spring-WS сильно отстой для такой базовой потребности, они должны исправить

7 голосов
/ 16 июня 2016

Вы можете сделать, как показано ниже:

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

Тогда

Object response = getWebServiceTemplate().marshalSendAndReceive(request, new SoapRequestHeaderModifier());
3 голосов
/ 16 февраля 2010

Вам необходимо привести WebServiceMessage к SoapMessage, который имеет метод getSoapHeader(), который вы можете использовать для изменения заголовка. В свою очередь, SoapHeader имеет различные методы для добавления элементов, включая getResult() (который может использоваться как результат операции Transformer.transform()).

0 голосов
/ 28 июня 2019

Ответный ответ = (Ответ) getWebServiceTemplate () .marshalSendAndReceive (запрос, новый HeaderModifier ());

Создание класса HeaderModifier и переопределение doWithMessage Открытый класс HeaderModifier реализует WebServiceMessageCallback {

 private static PrintStream out = System.out;

@Override
public void doWithMessage(WebServiceMessage message) throws IOException {
      SaajSoapMessage soapMessage = (SaajSoapMessage) message;

            SoapEnvelope soapEnvelope = soapMessage.getEnvelope();
            SoapHeader soapHeader = soapEnvelope.getHeader();

            //Initialize QName for Action and To 
            QName action = new QName("{uri}","Action","{actionname}");
            QName to = new QName("{uri}","To","{actionname}");


            soapHeader.addNamespaceDeclaration("{actionname}", "{uri}");


            SoapHeaderElement soapHeaderElementAction = soapHeader.addHeaderElement(action);
            SoapHeaderElement soapHeaderElementTo =  soapHeader.addHeaderElement(to);



            soapHeaderElementAction.setText("{text inside the tags}");


            soapHeaderElementTo.setText("{text inside the tags}");


            soapMessage.setSoapAction("{add soap action uri}");


            soapMessage.writeTo(out);

}

}

...