Mule ESB Web service mapping - PullRequest
       12

Mule ESB Web service mapping

1 голос
/ 28 февраля 2012

Я новичок, пытающийся реализовать простое отображение веб-службы в Mule.

По сути, поток должен получить запрос Soap ("ExampleWS1"), выполнить маршаллинг для bean-компонента, сопоставить этот bean-компонент сдругой, и отправить его в другой сервис.В свою очередь, тот же процесс сопоставления должен выполняться до тех пор, пока ответ Soap не будет возвращен вызывающей стороне.

С помощью хитрости я мог бы переслать запрос в виде объекта ("CriteriaWS1"), и все будет нормально, покавозвращая объект ответа («PersonWS1»), но я получаю следующее исключение:

com.acme.example.ws1.beans.PersonWS1 не может быть приведен к com.acme.example.ws1.beans.CriteriaWS1

Хитрость заключалась в том, чтобы опубликовать ExampleWS1 с этим контрактом, что позволило ему пересылать Criteria1, но я полагаю, что теперь это блокирующий ответ:

общедоступный поиск CriteriaWS1 (@WebParam (name = "критерии")КритерииWS1 критерий)

Полагаю, что этот сервис должен возвращать 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</p> <pre><code>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")</p> <pre><code>public Object search(@WebParam(name = "criteria") CriteriaWS1 criteria) { return criteria; }

...