我们正在构建一个实用程序,它将:
- 通过 RESTful 服务接受 JSON
- 将其映射到 POJO
- 将其转换为可用于调用远程 SOAP 服务的对象(JSON 与 SOAP-XML 不同,例如缺少一些字段,因此我们必须映射实体而不是进行自动化。)<
- 进行 SOAP API 调用并获取结果。
- 将此结果转换为 JSON 并将其发送回客户端。 (流程是同步的,以避免最初的复杂性)。
A 计划:我们成功尝试了 Mulesoft Anypoint studio 来构建流程。它提供了数据映射,我们可以轻松地将成员从 JSON 映射到 SOAP stub ,并将结果再次转换为 JSON。
B 计划:由于 A 计划中的许可限制,我计划使用 Camel 来实现。我对此很陌生,但可以成功构建 POC Web 应用程序,该应用程序公开了接受 JSON 的 servlet。但现在我陷入困境,因为我不知道如何转换和调用远程 SOAP 。 (WSDL 可用)。
预期流程
客户端 -> (Camel 从这里开始)RESTful 服务 -> 转换数据 -> 远程 SOAP -> 接受响应并转换为 JSON -> 发送回客户端。
任何指向正确方向的指针都会有所帮助。
最佳答案
看来您的主要问题是 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>
将上面的内容另存为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}')
将转换后的 json 发送回您的其余调用者。
希望有帮助。
关于json - 使用 Apache Camel 将 REST 自定义转换为 SOAP 到 REST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26490929/