Mule ESB Web service mapping
Я новичок, пытающийся реализовать простое отображение веб-сервисов в Mule.
По сути, поток должен получить запрос Soap ("ExampleWS1"), перенаправить его в компонент, сопоставить этот компонент другому и отправить его другому сервису. В свою очередь, тот же процесс сопоставления должен выполняться до тех пор, пока ответ Soap не будет возвращен вызывающей стороне.
С помощью хитрости я мог бы переслать запрос в виде объекта ("CriteriaWS1"), и все прошло нормально, пока не был возвращен объект ответа ("PersonWS1"), но я получил следующее исключение:
com.acme.example.ws1.beans.PersonWS1 не может быть приведен к com.acme.example.ws1.beans.CriteriaWS1
Хитрость заключалась в том, чтобы опубликовать ExampleWS1 с этим контрактом, что позволило ему пересылать Criteria1, но я полагаю, что теперь это блокирует ответ:
общедоступный поиск CriteriaWS1 (@WebParam(name="критерии") критерии CriteriaWS1)
Я предполагаю, что этот сервис должен возвращать PersonWS1, но как переслать объект CriteriaWS1? Я пробовал с каждой линейной комбинацией: cxf:proxy-service, pattern:web-proxy-service, transformer-refs, responseTransformer-refs... но никак. Может быть, я должен использовать Mule API, чтобы сделать что-то вроде этого из метода search(-):
output = muleClient.send("vm://nextFlowPiece", input);
Вот конфигурация, которую я использовал. Я использую Mule 3.2.1 под Mule IDE.
Любая помощь будет оценена, поэтому большое спасибо заранее.
Gabriele
<flow name="Demo_WS_2_WS_RequestReply_1">
<inbound-endpoint address="http://localhost:4006/services/ExampleWS1" exchange-pattern="request-response" />
<cxf:jaxws-service serviceClass="com.acme.example.ws1.ExampleWS1"/>
<component>
<singleton-object class="com.acme.example.ws1.ExampleWS1" />
</component>
<custom-transformer name="WS1WS2TransformerIn" class="com.acme.example.WS1WS2TransformerLegacy"/>
<vm:outbound-endpoint exchange-pattern="request-response" path="vm1_acq" responseTimeout="1000" />
<custom-transformer name="WS2WS1TransformerOut" class="com.acme.example.WS2WS1TransformerLegacy"/>
</flow>
<flow name="Demo_WS_2_WS_RequestReply_2">
<vm:inbound-endpoint exchange-pattern="request-response" path="vm1_acq" responseTimeout="1000" />
<cxf:jaxws-client
clientClass="com.acme.example.ws2.ExampleWS2Service"
port="ExampleWS2Port"
wsdlLocation="classpath:ExampleWS2.wsdl"
operation="search"/>
<outbound-endpoint exchange-pattern="request-response" address="http://localhost:4003/services/ExampleWS2"/>
</flow>
(PS: я прилагаю некоторый код в соответствии с просьбой Дэвида, с обоими решениями, которые я реализовал. Первое - менее сложное, поэтому я пойду с этим.)
1) переслать запрос с MuleClient из класса веб-сервиса после того, как он был разархивирован CXF:
@WebMethod
public PersonWS1 search(@WebParam(name="criteria") CriteriaWS1 criteria) { ... MuleMessage resultMessage = muleContext.getClient().process("vm://VM_FROM_INBOUND", MessageExchangePattern.REQUEST_RESPONSE, new DefaultMuleMessage(criteria, muleContext)); result = (PersonWS1)resultMessage.getPayload(); ... return result; }
2) объявить веб-метод для возврата "Object", затем запрос цепочки, как в примере выше, но аннотировать метод, чтобы JABX связывал ответ правильным способом:
@WebResult(name = "personWS1")
public Object search(@WebParam(name = "criteria") CriteriaWS1 criteria) { return criteria; }