Добавить SoapHeader в org.springframework.ws.WebServiceMessage
Как добавить объект в заголовок мыла org.springframework.ws.WebServiceMessage
Это структура, которую я ищу, чтобы закончить:
<soap:Header>
<credentials xmlns="http://example.com/auth">
<username>username</username>
<password>password</password>
</credentials>
</soap:Header>
Ответы
Ответ 1
По сути, вам нужно использовать 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 сильно отстой для такой базовой необходимости, они должны исправить SWS-479.
Ответ 2
Вы можете сделать следующее:
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
Вам нужно указать WebServiceMessage
на SoapMessage
, который имеет метод getSoapHeader()
, который вы можете использовать для изменения заголовка. В свою очередь, SoapHeader
имеет различные методы для добавления элементов, включая getResult()
(который может использоваться как результат операции Transformer.transform()
).
Ответ 4
Ответ ответ = (Ответ) 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);
}
}