Проблема, с которой вы сталкиваетесь, заключается в том, что веб-сервис на http://www.dneonline.com/calculator.asmx ожидает заголовок SOAPAction
. А поскольку вы не предоставляете один из них, служба не имеет представления о том, как направить запрос.
Для обучения, которое вы читаете, не требуется заголовок SOAPAction
для маршрутизации.
Если вы посмотрите, как операция Add
указана в WSDL , вы найдете там ожидаемое значение заголовка SOAPAction
. То же самое для всех других операций, предоставляемых службой.
<wsdl:operation name="Add">
<soap:operation soapAction="http://tempuri.org/Add" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
Предполагая, что ваш класс SoapConnector
идентичен классу в учебном пособии , вы можете удалить String url
как входные данные для метода callWebservice
, так как он уже установлен через client.setDefaultUri("http://www.dneonline.com/calculator.asmx");
в SoapConnector
боб. Вместо этого добавьте String soapAction
в качестве входного параметра, чтобы получить следующее
public class SOAPConnector extends WebServiceGatewaySupport {
public Object callWebService(Object request, String soapAction){
return getWebServiceTemplate().marshalSendAndReceive(url, new SoapActionCallback(soapAction));
}
}
Затем удалите wsdlurl
в качестве ввода для soapConnector.callWebService
(в любом случае это было неправильно) и добавьте значение soapHeader
для операции, которую вы хотите использовать вместо этого, оставляя вам этот
@Bean
CommandLineRunner lookup(SoapConnector soapConnector) {
return args -> {
Integer a = 10;
Integer b = 20;
if(args.length>0){
a = Integer.parseInt(args[0]);
b = Integer.parseInt(args[1]);
}
Add add = new Add();
add.setIntA(a);
add.setIntB(b);
AddResponse addRes = (AddResponse) soapConnector.callWebService(add, "http://tempuri.org/Add");
System.out.println("Got Response As below ========= : ");
System.out.println("Added result : "+addRes.getAddResult());
};
}
Конечно, если вы хотите использовать другие операции, кроме Add
, вам придется настроить это решение, чтобы сделать его универсальным.