Ваша проблема в том, что сервер, на котором вы пытаетесь выполнить операцию, не распознает заголовок SOAPAction
и поэтому не может направить ваши запросы в соответствующую конечную точку.Если вы посмотрите на WSDL службы , к которой вы пытаетесь подключиться, вы можете выполнить множество различных операций.
Для вашего конкретного примера, CreatePickup2
, операция указана как
<wsdl:operation name="CreatePickup2">
<soap:operation soapAction="http://dayrossgroup.com/web/public/webservices/shipmentServices/CreatePickup2" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
Поскольку вы уже указали defaultUri
в своем бобе, вам не нужно указыватьURL в вашем getWebServiceTemplate().marshalSendAndReceive(...)
методе.
Это даст вам компонент, похожий на этот
@Component
public class SOAPConnector extends WebServiceGatewaySupport {
public Object callWebService(Object request, String soapAction) {
return getWebServiceTemplate().marshalSendAndReceive(request, new SoapActionCallback(soapAction));
}
}
И клиентский код примерно такой
CreatePickup2Response result = (CreatePickup2Response) soapConnector
.callWebService(pickupReq, "http://dayrossgroup.com/web/public/webservices/shipmentServices/CreatePickup2");
Если вымы будем использовать более одной операции, которая понадобится вам, чтобы сделать предложенное решение более общим.