使用Apache Camel自定义将REST转换为SOAP到REST

nav*_*ger 5 json soap web-services esb apache-camel

我们正在建设一个实用工具,它将:

  1. 通过RESTful服务接受JSON
  2. 将其映射到POJO
  3. 将其转换为可用于调用远程SOAP服务的对象(JSON与SOAP-XML不同,例如缺少一些字段,因此我们必须映射实体而不是自动化.)
  4. 进行SOAP API调用,并获取结果.
  5. 将此结果转换为JSON并将其发送回客户端.(过程是同步的,以避免最初的复杂性).

计划A:我们成功尝试了Mulesoft Anypoint工作室来构建流程.它提供了数据映射,我们可以轻松地将成员从JSON映射到SOAP存根,并将结果再次转换为JSON.

计划B:由于计划A中的许可限制,我计划使用Camel进行.我是新手,但可以成功构建POC Web应用程序,它公开了一个接受JSON的servlet.但是现在我被卡住了,因为我不知道如何转换并拨打远程肥皂.(WSDL可用).

预期的流程

客户端 - >(Camel从这里开始)RESTful服务 - >转换数据 - >远程SOAP - >接受响应并转换为JSON - >发送回客户端.

任何指向正确方向的指针都会有所帮助.

Bal*_*nan 1

看来你的主要问题是 JSON<->SOAP 转换。您可以使用**freemarker**组件作为生产者并使用 freemarker 模板语言编写转换逻辑。下面是使用 FTL 进行 JSON 到 SOAP 转换的示例

<#ftl encoding="utf-8">
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:iser="http://example.com/service" xmlns:das="http://example.com/service">
   <soapenv:Header>
      <iser:header>
         <iser:username></iser:username>
         <iser:password></iser:password>
         <iser:agency>${body.customer.name}</iser:agency>
      </iser:header>
   </soapenv:Header>
   <soapenv:Body>
      <iser:readCompositeAddressByAddressNum>
         <iser:arg1 addressNum="${body.customer.addressNum}" buildingCode="0" cityCode="0" districtCode="0" quarterCode="0" streetCode="0" streetTypeCode="0" townshipCode="0" villageCode="0">
         </iser:arg1>
      </iser:readCompositeAddressByAddressNum>
   </soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)

将上面保存为inputTransformer.ftl。创建输出转换器 ftl(SOAP 到 JSON)并在界面中使用两者,如下所示

from("direct-vm:getCustomerDetail")
.routeId("getCustomerDetail")
..
..
.to("freemarker:inputTransformer.ftl")
.log('{$body}')
.to(<Your SOAP Service>)
..
..
.to("freemarker:outputTransformer.ftl")
.log('${body}')
Run Code Online (Sandbox Code Playgroud)

将转换后的 json 发送回您的其余调用者。

希望有帮助。