#eclipse #web-services #wsdl #mule #endpoint
#затмение #веб-сервисы #wsdl #mule #конечная точка
Вопрос:
Я следовал этому руководству, которое действительно отлично подходит для использования служб 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. Таким образом, я вижу, что существует полезная нагрузка, когда я отправляю запрос в Mule от клиента в Eclipse.
3- Мне нужно, чтобы приложение, а именно мое клиентское приложение в eclipse, использовало опубликованный сервис в Mule. Теперь я думаю, что это достигается с помощью компонента CXF, но мне все еще не удается заставить его работать. На самом деле, мне интересно, является ли это одним из допустимых способов использования Mule, поскольку я не смог найти ни одного руководства о том, чего я пытаюсь достичь.
Итак, вот как я это тестирую:
Я использовал ту же конечную точку, что и в 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. Вот мой код mule:
<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. Спасибо за быстрый ответ, я отредактировал свой вопрос. Я надеюсь, что это нормально, иначе я могу сделать это более понятным.
3. Любой вклад был бы оценен. Спасибо.
Ответ №1:
Вы должны создать экземпляр класса message, который был сгенерирован для ResolveIP
метода из WSDL, и использовать его в качестве полезной нагрузки сообщения перед cxf:jaxws-client
элементом.
Комментарии:
1. Действительно, я попытался настроить полезную нагрузку, как было предложено, и это работает. Тем не менее, мне удалось найти свою проблему, удалив клиент cxf и просто оставив исходящий HTTP с адресом местоположения WSDL, и теперь он возвращает правильный ответ. Таким образом, проблема заключалась в наличии двух клиентов, одного в eclipse и одного в mule. Спасибо за ваш ответ!