Как создать Axis Client без ссылки на wsdl? - PullRequest
1 голос
/ 21 мая 2011

Я хочу создать клиент 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/}stackTrace: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 Ответ

2 голосов
/ 29 апреля 2012

У меня была такая же проблема, как и у вас. После нескольких часов копания кажется, что я почти решил эту проблему. Это исключение происходит из-за отсутствия установленного целевого адреса конечной точки Вот мой код

        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 внутри элемента порта. Вот пример

<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 в http://schemas.xmlsoap.org/soap/encoding/ (это значение по умолчанию) Здесь - документ, который я нашел для решения этой проблемы

Надеюсь, это поможет вам! Извините за мой плохой английский.

...