我是一个尝试在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;
}