如何将 Mule ESB 中的数据映射器转换为多个连接器以使用社区运行时?
How to convert data-mapper in Mule ESB to many connectors to use Community Runtime?
所以我使用 Datamappers 完成了我的所有项目,但是当我想部署 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 中,我在日期中做了一些特别的事情
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 以发送到网络服务:
<?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>
感谢您的帮助。
首先使用 json-to-object-transformer
创建一个 Map
的 Map
表示 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>
所以我使用 Datamappers 完成了我的所有项目,但是当我想部署 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 中,我在日期中做了一些特别的事情
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 以发送到网络服务:
<?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>
感谢您的帮助。
首先使用 json-to-object-transformer
创建一个 Map
的 Map
表示 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>