Как создать Axis Client без URL-адреса wsdl?
Я хочу создать клиент Axis для веб-службы с локальным wsdl, не зная URL-адреса wsdl. Я попробовал метод интерфейса динамического вызова, как в этом учебнике http://www.ibm.com/developerworks/webservices/library/ws-javaclient/index.html но я получаю следующую ошибку:
AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/‹Server.generalException faultSubcode: faultString: Не найден клиентский транспорт с именем 'null'! faultActor: faultNode: faultDetail: {http://xml.apache.org/axis/ innovativestackTrace:No транспорт клиента с именем 'null' найден! в org.apache.axis.client.AxisClient.invoke(AxisClient.java:170)
Мой код:
ServiceFactory factory = ServiceFactory.newInstance();
Service service = factory.createService(new QName("http://j2ee.netbeans.org/wsdl/CompositionBpelModule/ComposedWebServiceService","ComposedWebServiceServiceService"));
Call call = service.createCall();
call.setPortTypeName(new QName("http://j2ee.netbeans.org/wsdl/CompositionBpelModule/ComposedWebServiceService","ComposedWebServiceServicePortType"));
call.setProperty(Call.OPERATION_STYLE_PROPERTY, "wrapped");
call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY, "");
call.setReturnType(XMLType.XSD_STRING);
call.setOperationName(new QName("http://j2ee.netbeans.org/wsdl/CompositionBpelModule/ComposedWebServiceService", "ComposedWebServiceServiceOperation"));
call.addParameter("input1", XMLType.XSD_STRING, ParameterMode.IN);
String[] params = {input};
response = (String)call.invoke(params);
Спасибо
1 ответ
У меня была такая же проблема, как и у вас. После нескольких часов копания кажется, что я почти решил эту проблему. Это исключение происходит из-за отсутствия установленного целевого адреса конечной точки. Вот мой код
Call call = service.createCall();
call.setPortTypeName(portQName);
call.setOperationName(new QName(namespace, operation));
call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY, "http://schemas.xmlsoap.org/soap/encoding/");
call.setProperty(Call.OPERATION_STYLE_PROPERTY, "rpc");
call.addParameter("in0", org.apache.axis.Constants.XSD_STRING ,ParameterMode.IN);
call.addParameter("in1", org.apache.axis.Constants.XSD_STRING ,ParameterMode.IN);
call.setReturnType(serviceQName);
String targetEndpoint = "http://113.160.19.218:8312/axis/services/WeatherForecastTest1";
call.setTargetEndpointAddress(targetEndpoint);
String result = (String) call.invoke(params);
out.println(result);
Значение аргумента targetEndpoint является значением атрибута location элемента address внутри элемента port. Вот пример
<service name="WeatherForecastTest1Service">
<port binding="impl:WeatherForecastTest1SoapBinding" name="WeatherForecastTest1">
<wsdlsoap:address location="http://113.160.19.218:8312/axis/services/WeatherForecastTest1"/>
</port>
</service>
Вы можете получить это значение, получив документ wsdl с помощью некоторого wsdlParser (я использую WSDL4J от Axis) (обратите внимание, что в приведенном выше примере кода я жестко закодировал значение targetEndpoint)
Кроме того, я установил OPERATION_STYLE_PROPERTY
в стиле RPC и ENCODINGSTYLE_URI_PROPERTY
to http://schemas.xmlsoap.org/soap/encoding/ (это значение по умолчанию) Вот документ, который я нашел для решения этой проблемы
Надеюсь, что это поможет вам! Извините за мой плохой английский.