【问题标题】:How to convert data-mapper in Mule ESB to many connectors to use Community Runtime?如何将 Mule ESB 中的数据映射器转换为多个连接器以使用社区运行时?
【发布时间】:2015-04-20 23:56:39
【问题描述】:

所以我使用 Datamapper 完成了所有项目,但当我想部署 DataMapper 时,我意识到 DataMapper 仅适用于企业。所以现在我需要重新做所有的工作。

我的问题是,如何将我的 DataMappers 转换为免费连接器?它们始终是 JSON 到 XML 数据映射器。

对于一个简单的 GetContactById,我在 Object to String 之后设置了一个有效负载。像这样:

<ns0:GetContactById xmlns:ns0="http://tempuri.org/"><ns0:id>#[json:id]</ns0:id></ns0:GetContactById>

这很有效,但是对于 JSON 很大并且可以更改的更复杂的情况,我不知道该使用什么。

我应该使用 JSON 到 XML,然后是 XSLT,或者如果我有更多的条件,可以构建一个自定义转换器?

例如,在我的 OrderSave 中,我在 Date 中做了一些特别的事情

output.ns1_ContactId = input.ContactId;
output.ns1_Discount = input.Discount;
output.ns1_NumberOfChild = input.NumberOfChild;
output.ns1_OrderDate = str2calendar(input.OrderDate, "yyyy-MM-dd' 'HH:mm:ss");
output.ns1_OrderNumber = input.OrderNumber;
output.ns1_PaymentMethod = input.PaymentMethod;
output.ns1_SpouseName = input.SpouseName;
output.ns1_Total = input.Total;

我有每个订单和每个产品。

这正是我想要完成的:

收到 JSON :

{
    "order": {
        "Id": "112",
        "Discount": "0.000000",
        "OrderDate": "2015-03-26 15:26:38",
        "OrderNumber": "VBOKLZZZF",
        "Total": "43.810000",
        "NumberOfChild": "2",
        "PaymentMethod": 1,
        "SpouseName": "Caroline Person",
        "Products": [
            {
                "Product": {
                    "Quantity": "1",
                    "UnitPrice": null,
                    "Code": "AB20"
                }
            }
        ]
    }
}

JSON 转换成 XML 发送到 webservice :

<?xml version="1.0" encoding="ISO-8859-1"?>
<ns0:SaveOrder xmlns:ns0="http://tempuri.org/">
  <ns0:order>
    <ns1:Id xmlns:ns1="http://schemas.datacontract.org/2004/07/Service.Entities">112</ns1:Id>
    <ns1:Discount xmlns:ns1="http://schemas.datacontract.org/2004/07/Service.Entities">0.0</ns1:Discount>
    <ns1:NumberOfChild xmlns:ns1="http://schemas.datacontract.org/2004/07/Service.Entities">2</ns1:NumberOfChild>
    <ns1:OrderDate xmlns:ns1="http://schemas.datacontract.org/2004/07/Service.Entities">2015-03-26T15:26:38.000Z</ns1:OrderDate>
    <ns1:OrderNumber xmlns:ns1="http://schemas.datacontract.org/2004/07/Service.Entities">VBOKLZZZF</ns1:OrderNumber>
    <ns1:PaymentMethod xmlns:ns1="http://schemas.datacontract.org/2004/07/Service.Entities">1</ns1:PaymentMethod>
    <ns1:Products xmlns:ns1="http://schemas.datacontract.org/2004/07/Service.Entities">
      <ns1:Product>
        <ns1:Code>AB20</ns1:Code>
        <ns1:Quantity>1</ns1:Quantity>
      </ns1:Product>
    </ns1:Products>
    <ns1:SpouseName xmlns:ns1="http://schemas.datacontract.org/2004/07/Service.Entities">Caroline Person</ns1:SpouseName>
    <ns1:Total xmlns:ns1="http://schemas.datacontract.org/2004/07/Service.Entities">43.81</ns1:Total>
  </ns0:order>
</ns0:SaveOrder>  

感谢您的帮助。

【问题讨论】:

标签: java xml json mule mule-studio


【解决方案1】:

首先使用json-to-object-transformer 创建一个MapMaps 代表JSON 输入:

<json:json-to-object-transformer returnClass="java.util.Map" />

然后使用 Groovy 脚本转换器通过其出色的标记生成器生成 XML:http://groovy-lang.org/processing-xml.html#_markupbuilder

这是来自an old article I wrote a while ago的示例:

<scripting:transformer name="OrderMapToMicroformat"> 
   <scripting:script engine="groovy"> <![CDATA[ 
        def writer = new StringWriter() 
        def xml = new groovy.xml.MarkupBuilder(writer) 
        xml.order(xmlns: 'urn:acme:order:3:1') { 
          customerId(payload.clientId) 
          productId(payload.productCode) 
          quantity(payload.quantity) 
        } 
        result = writer.toString() ]]> 
    </scripting:script> 
</scripting:transformer>

【讨论】:

  • 大卫您好,感谢您的帮助。在这种情况下,我对表达式组件如何帮助我感到有些困惑。我看到它用于评估表达式。另外我不明白为什么要将 JSON 转换为 Java 对象并将其重新转换回 JSON,然后再将其转换为 XML 我想?我在我的问题中添加了详细信息,以准确显示我想要做什么。再次感谢您的帮助。
  • 抱歉,我误解了您的用例。我已经相应地审查了我的答案。
  • 我尝试了我的简单示例,它似乎可以正常工作!我想它也适用于我更大的 JSON。感谢大卫的回答。
猜你喜欢
  • 2015-06-06
  • 1970-01-01
  • 2017-01-20
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多