org.springframework.ws.soap.client.SoapFaultClientException при использовании Spring WS WebServiceTemplate
Столкнулся со следующей проблемой: у меня есть wsdl файл для общения моего сервиса и CRM посредством протокола SOAP. Body запроса заполняется через конфигурирование файлов java из wsdl. А вот header необходимо прописать вручную. Я использую следующую технологию для отправки моего запроса:
final Map<String, String> gateValues = new HashMap<>();
final String username = Objects.requireNonNull(config).getSoapconf().getUsername();
final String password = Objects.requireNonNull(config).getSoapconf().getPassword();
final String webServices = Objects.requireNonNull(config).getSoapconf().getSessionType();
gateValues.put("UsernameToken", username);
gateValues.put("PasswordText", password);
gateValues.put("SessionType", webServices);
GetInput rq = new GetInput();
rq.setMyParam(param);
log.info("Requesting {}", param);
try {
GetOutput client = (GetOutput) getWebServiceTemplate().marshalSendAndReceive(rq, (message) -> {
if (message instanceof SaajSoapMessage) {
SaajSoapMessage saajSoapMessage = (SaajSoapMessage) message;
SOAPMessage soapMessage = saajSoapMessage.getSaajMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
try {
SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
SOAPHeader soapHeader = soapEnvelope.getHeader();
gateValues.forEach((key, value) -> {
try {
Name headerElementName = soapEnvelope.createName(
key,
PREFIX,
NAMESPACE
);
System.out.println(headerElementName.getLocalName() + "\n" + headerElementName.getQualifiedName());
SOAPHeaderElement soapHeaderElement = soapHeader.addHeaderElement(headerElementName);
soapHeaderElement.setTextContent(value);
} catch (SOAPException e) {
// error handling
}
});
soapMessage.saveChanges();
soapMessage.writeTo(System.out);
System.out.println(soapEnvelope.getHeader());
} catch (SOAPException e) {
System.out.println();
}
}
});
return client;
} catch (Exception e) {
ExceptionUtils.getStackTrace(e);
}
`
Последний catch был добавлен уже для поиска ошибки. Падает с ошибкой org.springframework.ws.soap.client.SoapFaultClientException из метода doSendAndReceive класса WebServiceTemplate.
При вызове soapMessage.writeTo(System.out); я получаю в консоль валидный xml-запрос(копирую его и отправляю через SOAPUI - всё работает.
`
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<PasswordText xmlns="http://***.com/services">myPass</PasswordText>
<SessionType xmlns="http://****.com/services">mySessionType</SessionType>
<UsernameToken xmlns="http://***.com/services">myUsName</UsernameToken>
</SOAP-ENV:Header>
<SOAP-ENV:Body><ns2:Get_Input xmlns:ns2="http://***.com/UI" xmlns:ns3="http://***.com/xml/%20External">
<ns2:param>238068014416</ns2:param>
</ns2:Get_Input>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
` Чего не хватает? Почему по SOAPUI - он валиден. Запрос клиента сделан по примеру последнего ответа из https://stackoverflow.com/questions/2274378/add-soapheader-to-org-springframework-ws-webservicemessage