Мул: как использовать сервис от удаленного клиента


Я следовал этому учебнику, который действительно отлично подходит для использования сервисов wb из WSDL http://training.middlewareschool.com/mule/consuming-wsdl-first-service/. Я пытался сделать аналогичный подход, создав клиентский веб-сервис в Eclipse с помощью CXF и опубликовав веб-сервис в Mule. Мой вопрос: если я настрою для клиента и приложения mule одну и ту же конечную точку (например: localhost: 8082 / ipsoap / test), как я могу заставить работать веб-службу так же, как и с учебником. То есть, если я тестирую отправку запроса mule от клиента (в eclipse), я должен получить правильный ответ от mule. Заранее благодарю вас за потраченное время.

Короче говоря:

1-я создал клиентское приложение в eclipse, используя wsdl по следующей ссылке в учебнике: http://ws.cdyne.com/ip2geo/ip2geo.asmx?wsdl

2-Для начала в Mule я добавил http-коннектор и регистратор и изменил путь к конечной точке в eclipse на тот Я установил на муле HTTP-коннектор. Таким образом, я могу видеть, что есть полезная нагрузка, когда я посылаю запрос Mule от клиента в Eclipse.

3 - мне нужно иметь приложение, а именно мое клиентское приложение в eclipse, потребляющее опубликованный сервис в Mule. Теперь я думаю, что это достигается с помощью компонента CXF, но я все еще не могу заставить его работать. На самом деле, я задаюсь вопросом, является ли это одним из допустимых способов использования Мула, поскольку я не смог найти никакого учебника о том, чего я пытаюсь достичь.

Итак, вот как я проверить его: Введите описание изображения здесь

Я использовал ту же конечную точку, что и в Mule, и получил следующий журнал:

> INFO  2014-07-07 13:19:46,124
> [[soapservice].connector.http.mule.default.receiver.02]
> org.mule.api.processor.LoggerMessageProcessor: message transformation
> <soapenv:Envelope
> xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
> xmlns:q0="http://ws.cdyne.com/"
> xmlns:xsd="http://www.w3.org/2001/XMLSchema"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
> <soapenv:Body>
>     <q0:ResolveIP>
>       <q0:ipAddress>173.194.36.39</q0:ipAddress>
>       <q0:licenseKey/>
>     </q0:ResolveIP>   </soapenv:Body> </soapenv:Envelope>
> 
> ERROR 2014-07-07 13:19:46,134
> [[soapservice].connector.http.mule.default.receiver.02]
> org.mule.exception.DefaultMessagingExceptionStrategy: 
> ******************************************************************************** Message               : wrong number of arguments. Failed to route
> event via endpoint: org.mule.module.cxf.CxfOutboundMessageProcessor.
> Message payload is of type: String Code                  :
> MULE_ERROR--2
> -------------------------------------------------------------------------------- Exception stack is:
> 1. wrong number of arguments (java.lang.IllegalArgumentException)   sun.reflect.NativeMethodAccessorImpl:-2 (null)
> 2. wrong number of arguments. Failed to route event via endpoint: org.mule.module.cxf.CxfOutboundMessageProcessor. Message payload is of
> type: String (org.mule.api.transport.DispatchException)  
> org.mule.module.cxf.CxfOutboundMessageProcessor:150
> (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transport/DispatchException.html)
> -------------------------------------------------------------------------------- Root Exception stack trace: java.lang.IllegalArgumentException: wrong
> number of arguments   at
> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)   at
> sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)   at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
>     + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)

Как вы можете видеть, запрос soap можно увидеть, но он не потребляется на уровне компонента CXF. Вот мой код мула:

<flow name="SoapService" doc:name="SoapService">
        <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8082" path="test/cap.asmx" doc:name="HTTP"/>
        <byte-array-to-string-transformer doc:name="Byte Array to String"/>
        <logger message="message transformation #[message.payload]" level="INFO" doc:name="Logger"/>
        <flow-ref name="RequestResponse" doc:name="Flow Reference"/>
        <logger level="INFO" doc:name="Logger" message="after posting #[message.payload]"/>
        <mulexml:object-to-xml-transformer doc:name="Object to XML"/>
    </flow>
    <flow name="RequestResponse" doc:name="RequestResponse">
        <cxf:jaxws-client operation="ResolveIP" clientClass="pck.IP2Geo" port="IP2GeoSoap" wsdlLocation="file:/C:/Users/12204-hajjam1/workspace/ipgo/src/ipgeo.wsdl" doc:name="soap 2"/>
        <logger message="before posting #[message.payload]" level="INFO" doc:name="Logger"/>
        <http:outbound-endpoint exchange-pattern="request-response" method="POST" address="http://localhost:10387/ip2geo/ip2geo.asmx" doc:name="HTTP"/>
    </flow>

Также, если я добавлю набор полезных данных с ip #[{'173.194.36.39',"}] (второй аргумент можно оставить пустым) перед компонентом cxf он возвращает пустой элемент. Тем не менее, ответ должен быть примерно таким:

<pck.IPInformation>
<city>Mountain View</city>
<stateProvince>CA</stateProvince>
<country>United States</country>
<organization/>
<latitude>37.4192</latitude>
<longitude>-122.0574</longitude>
<areaCode>0</areaCode>
<timeZone/>
<hasDaylightSavings>false</hasDaylightSavings>
<certainty>90</certainty>
<regionName/>
<countryCode>US</countryCode>
</pck.IPInformation> 

Таким образом, мой проблема заключается в потреблении и получении ответа. Я прошу прощения за длину, но я боролся с этим и не нашел решения в интернете. Заранее спасибо.

1 2

1 ответ:

Следует создать экземпляр класса message, который был сгенерирован для метода ResolveIP из WSDL, и использовать его в качестве полезной нагрузки сообщения перед элементом cxf:jaxws-client.