简体   繁体   English

如何将Mule ESB中的数据映射器转换为许多连接器以使用社区运行时?

[英]How to convert data-mapper in Mule ESB to many connectors to use Community Runtime?

So I did all my project using Datamappers, but I realized when I wanted to deploy that DataMapper is only available for Enterprise. 因此,我使用Datamappers完成了所有项目,但是当我想部署DataMapper仅适用于Enterprise时,我意识到了这一点。 So now I need to redo all my work again. 所以现在我需要重新做所有工作。

My question is, how do I convert my DataMappers to free connectors? 我的问题是,如何将DataMappers转换为免费的连接器? They are always JSON to XML datamappers. 它们始终是JSON到XML数据映射器。

For a simple one GetContactById I do a set payload after Object to String. 对于一个简单的GetContactById,我在Object to String之后设置了一个有效载荷。 Like so : 像这样:

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

And this works but for more complicated ones where the JSON is huge and can change I do not know what to use. 这是可行的,但对于JSON庞大且可以更改的更复杂的代码,我不知道该使用什么。

Should I use JSON to XML and then XSLT or maybe build a custom transformers if I have more conditions? 如果我有更多条件,应该使用JSON转换为XML,然后使用XSLT还是构建自定义转换器?

For example in my OrderSave I do something special in the Date 例如,在我的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;

And I have for each Order and for each Product. 我有每个订单和每个产品。

Precisely here's what I want to accomplish : 正是我要完成的任务:

JSON received : 收到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 converted to XML to send to webservice : 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>  

Thanks for helping. 感谢您的帮助。

First use a json-to-object-transformer to create a Map of Map s representing the JSON input: 首先使用json-to-object-transformer来创建MapMap代表中国的JSON输入:

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

Then use a Groovy scripting transformer to generate the XML using its excellent Markup Builder: http://groovy-lang.org/processing-xml.html#_markupbuilder 然后使用Groovy脚本转换器使用其出色的标记生成器来生成XML: http : //groovy-lang.org/processing-xml.html#_markupbuilder

Here is a sample from 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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM