Вызов клиента CXF через Java Bean с помощью Mule

Я пытаюсь использовать этот веб-сервис: http://wsf.cdyne.com/WeatherWS/Weather.asmx?wsdl из другого wsdl... Не беспокойтесь об этом, я просто пытаюсь сделать какой-то мост для проверки вызова веб-сервиса без какой-либо логики, поэтому поток, который мне нужен, примерно такой

cxf:jaxws-service --- > Java bean ----> externalWebservice

Проблема в том, что я не могу найти, как вызвать через мой класс java impl внешний веб-сервис, мне нужно внедрить это в свой компонент, но я не могу найти, как это сделать. На самом деле мой поток таков:

    <flow name="soapservice" doc:name="soapservice">
        <http:inbound-endpoint exchange-pattern="request-response"
            address="http://localhost:60603/Hello" doc:name="HTTP" />
        <cxf:jaxws-service serviceClass="org.example.HelloWorld"
            doc:name="SOAP" />
        <component class="org.example.HelloWorldImpl" doc:name="Java" />
    </flow>

Все работает нормально, служба возвращает параметр ввода, но мне нужно получить некоторые данные из веб-службы погоды. Кто-нибудь может помочь мне использовать этот веб-сервис с помощью CXF?

Спасибо!


person Nicolas    schedule 19.04.2013    source источник


Ответы (1)


Для этого лучше всего создать еще одну flow с request-response входящей виртуальной машиной и клиентом CXF для использования удаленной веб-службы. Ниже объясняется, как создать клиент CXF: http://www.mulesoft.org/documentation/display/current/Consuming+Web+Services+with+CXF

Затем вы можете внедрить этот другой flow в свой component через привязки компонентов (см.: http://www.mulesoft.org/documentation/display/current/Component+Bindings). Таким образом, org.example.HelloWorldImpl будет иметь возможность вызывать удаленную веб-службу через вызов интерфейса, который за сценой вызывает поток, выполняющий взаимодействие с клиентом CXF.

Итак, в вашем случае, если предположить:

  • сервисный интерфейс, сгенерированный CXF, — com.cdyne.wsf.WeatherWS,
  • интересующий вас метод - getCityWeatherByZip,
  • клиент службы создания CXF — com.cdyne.wsf.WeatherWS_Service,
  • класс org.example.HelloWorld может получить экземпляр com.cdyne.wsf.WeatherWS путем внедрения

у вас будет что-то похожее на:

<flow name="soapservice">
    <http:inbound-endpoint exchange-pattern="request-response"
        address="http://localhost:60603/Hello" />
    <cxf:jaxws-service serviceClass="org.example.HelloWorld" />
    <component class="org.example.HelloWorldImpl">
        <binding interface="com.cdyne.wsf.WeatherWS"
            method="getCityWeatherByZip">
            <vm:outbound-endpoint path="callGetCityWeatherByZip"
                exchange-pattern="request-response" />
        </binding>
    </component>
</flow>

<flow name="getCityWeatherByZip">
    <vm:inbound-endpoint path="callGetCityWeatherByZip"
        exchange-pattern="request-response" />

    <cxf:jaxws-client
        clientClass="com.cdyne.wsf.WeatherWS_Service"
        port="WeatherSoap" operation="GetCityWeatherByZip" />

    <http:outbound-endpoint
        address="http://wsf.cdyne.com/WeatherWS/Weather.asmx"
        exchange-pattern="request-response" />
</flow>
person David Dossot    schedule 19.04.2013
comment
Спасибо за ответ! Очень полезно немного больше понять это, моя проблема в том, что я не могу найти, как сделать привязку с этим новым клиентом cxf, который вы называете. Если вы можете помочь мне показать код, было бы здорово. Заранее спасибо =) - person Nicolas; 19.04.2013
comment
Еще вопрос (последний). Mule говорит, что vm:outbound-endpoint не может быть дочерним элементом Binding. Вот так? - person Nicolas; 19.04.2013
comment
У меня нет этой проблемы. Это что-то, что вы видите в своем редакторе XML, или исключение, выдаваемое при запуске? Если первый и Мул запускается: просто игнорируйте его. - person David Dossot; 19.04.2013
comment
Редактор выдает эту ошибку, и ничего не происходит, когда я пытаюсь развернуть службу. Но я вещь, которая связана с другими вещами. Теперь моя очередь кодить. Спасибо еще раз! - person Nicolas; 20.04.2013
comment
Не стесняйтесь задавать другой вопрос, если вы столкнулись с дополнительными проблемами. Хотя с другим тестовым веб-сервисом, я сначала проверил свой ответ, прежде чем публиковать его, поэтому он должен работать для вас. Это было на Mule 3.3.1, но должно работать так же и на 3.4.0. - person David Dossot; 20.04.2013
comment
Я использую Mule 3.4.0 и пытаюсь развернуть ваш код, я получаю java.lang.ClassNotFoundException: com.cdyne.wsf.WeatherWS... Поэтому я заменяю определение класса в привязке для com.cdyne.ws.weatherws.WeatherSoap ... После этого говорит, что не может найти класс com.cdyne.wsf.WeatherWS_Service, поэтому я меняю clientClass в jaxws-клиенте на com.cdyne.ws.weatherws.Weather. После этого все выглядит хорошо, поэтому я снова пытаюсь развернуть... И теперь показывает следующую ошибку: javax.xml.ws.WebServiceException: Port {ws.cdyne.com/WeatherWS}WeatherSoap не найден. Извините за настойчивость, но я действительно потерял - person Nicolas; 20.04.2013
comment
Как сказано в моем ответе, я сделал предположения об именах классов/интерфейсов, сгенерированных CXF: вы должны использовать правильные имена на основе генерации CXF и, возможно, вы настроили его. То же самое для port: вы должны использовать правильные значения для вашего примера, я только что показал вам рабочий подход для взаимодействия с клиентом CXF через привязку компонентов, но я не сделал этого для вашего конкретного случая. Это твоя работа :) - person David Dossot; 20.04.2013
comment
Если вам нужна более качественная помощь, откройте другой вопрос о состоянии ваших потоков, созданном вручную и сгенерированном коде Java. Это поможет помочь вам. - person David Dossot; 20.04.2013