Mule ESB Web服务映射

时间:2012-02-28 15:11:48

标签: soap cxf transform mule forward

我是一个尝试在Mule中实现简单Web服务映射的新手。

基本上,流应该接收Soap请求(“ExampleWS1”),将其编组到bean,将此bean映射到另一个,然后将其发送到另一个服务。作为回报,应该执行相同的映射过程,直到将Soap响应返回给调用者。

有了一个技巧,我可以以对象的形式转发请求(“CriteriaWS1”),一切顺利,直到返回响应对象(“PersonWS1”),但我得到以下异常:

com.acme.example.ws1.beans.PersonWS1无法强制转换为com.acme.example.ws1.beans.CriteriaWS1

诀窍是使用此合约发布ExampleWS1,允许它转发Criteria1,但我想现在这是阻止响应:

public CriteriaWS1 search(@WebParam(name =“criteria”)CriteriaWS1 criteria)

我想这个服务应该返回PersonWS1,但是如何转发对象CriteriaWS1? 我尝试过每个线性组合:cxf:proxy-service,pattern:web-proxy-service,transformer-refs,responseTransformer-refs ......但是没办法。 也许我必须使用Mule API在搜索( - )方法中执行类似的操作:

output = muleClient.send("vm://nextFlowPiece", input);

这是我使用的配置。我在Mule IDE下使用Mule 3.2.1。

任何帮助将不胜感激,非常感谢提前。

加布里埃尔

<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:我根据David的要求附上一些代码,我实施了两种解决方案。第一种是不那么棘手,所以我会继续使用。)

1)在CXF解组之后,在Web服务类中使用MuleClient转发请求:

@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;
}

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)声明web方法返回一个“Object”,然后链请求作为上面的例子,但是注释方法让JABX以正确的方式绑定响应:

@WebResult(name = "personWS1")

public Object search(@WebParam(name = "criteria") CriteriaWS1 criteria) {
    return criteria;
}

0 个答案:

没有答案