EnjoyingSoft之Mule ESB开发教程第六篇:Data Transform - 数据转换

目录

  • 1. 数据转换概念
  • 2. 数据智能感知 - DataSense
  • 3. 简单数据转换组件
    • 3.1 Object to JSON
    • 3.2 JSON to XML
    • 3.3 JSON to Object
    • 3.4 XML to JSON
  • 4. 企业版的DataWeave Transformer(可视化高级数据转换器)
  • 5. 社区版的InfoMapper(自研的可视化数据转换器)

本篇主要介绍在Mule ESB中使用数据转换。数据转换是ESB最核心的功能,它消除了异构应用之间的技术差异,让不同的应用服务协调运作,实现了不同服务之间的通讯。数据转换或者说消息转换,包括了数据结构,数据类型,数据内容的转换等。

作为开源ESB产品中很成熟的平台,Mule ESB内置很多的消息转换组件,比如Object to JSON,Object to XML,XML to JSON等,同时也支持使用自定义的Transformer来扩充自定义转换逻辑。

另外Mule ESB企业版更拥有图形化的消息转换组件DataWeave,可以很灵活的进行数据的转换,包括一对一,一对多,多对一的映射。我们在社区版上也研发了相应的扩展组件InfoMapper,做到类似DataWeave的强大功能。

Mule ESB起源于一个社区项目,经过十多年的发展,Mule ESB拥有众多的企业客户案例,2017年成功在纽交所上市。我们作为MuleSoft的重要合作伙伴,参与其中,使用Mule ESB企业版实施开发,或者Mule ESB社区版实施开发,帮助国内众多的行业领先客户成功上线Mule ESB集成项目。

Mule ESB的源代码托管在GitHub上,英文文档也非常丰富,Mule ESB的中文教程却非常少,我们使用8篇Mule ESB的开发教程来帮助大家迅速上手Mule ESB开发。

  • EnjoyingSoft之Mule ESB开发教程第一篇:初识Mule ESB
  • EnjoyingSoft之Mule ESB开发教程第二篇:Mule ESB基本概念
  • EnjoyingSoft之Mule ESB开发教程第三篇:Mule message structure - Mule message结构
  • EnjoyingSoft之Mule ESB开发教程第四篇:Mule Expression Language - MEL表达式
  • EnjoyingSoft之Mule ESB开发教程第五篇:控制消息的流向-数据路由
  • EnjoyingSoft之Mule ESB开发教程第六篇:Data Transform - 数据转换
  • EnjoyingSoft之Mule ESB开发教程第七篇:SOAP Web Service的消费和创建
  • EnjoyingSoft之Mule ESB开发教程第八篇:使用API构建Rest Service

1. 数据转换概念

数据转换是ESB平台的核心模块,是解决异构系统通讯的必备组件。举个例子,订单系统暴露了一个Web Service,而我们的网上商城生成的订单是Json或者Flat file格式,将JSON数据或者Flat file文本格式转换成Web Service的XML格式,这个需求就可以通过ESB来实现。我们在第三篇讲解了Mule Message的结构,回忆一下Mule Message的结构。

1490365-20190803142209104-1091252945.png

我们通常说的数据转换就是对Mule Message中Payload做操作,改变数据类型或者数据结构,数据内容等。在做数据转换之前,我们需要确定数据的源类型和目标类型,然后选择合适的数据转换组件。

1490365-20190803142225610-1695452072.png

2. 数据智能感知 - DataSense

DataSense是Mule最强大的功能之一,Anypoint Studio会主动获取元数据类型和结构等信息,以帮助开发者在应用程序中准确的映射或者使用数据。

DataSense配合企业版的DataWeave可视化数据转化组件,或者我们自研的社区版可视化数据转化组件InfoMapper,能够很大的加速应用集成的开发,方便开发者完成数据转换和映射。本文后半段会介绍DataWeave和InfoMapper的强大之处。

DataSense举例说明,如果您的应用程序连接到一个天气预报的Web Service,那么DataSense会捕获Web Service使用的数据类型和结构的信息,这些信息对开发者非常有用,它会展示这个Web Service期望的的入参是什么,出参是什么。

天气预报WebService中规定的入参和出参如下图:

1490365-20190803142243286-1749226012.png

Anypoint Studio中的Web Service Consumer组件,会清楚的显示Expected Data,也就是期望的入参数据格式。如下图Input页签,可以看到需要输入theCityName的XML数据。

1490365-20190803142300453-700579106.png

同时Web Service Consumer组件也会展示这个WebService的输出参数是什么。如下图Output页签。

1490365-20190803142311471-567488697.png

3. 简单数据转换组件

Mule ESB内置了很多常用的简单的数据转换组件,从组件名称就可以看到组件的适用范围,源数据类型和目标数据类型。另外Mule ESB也支持自定义Transformer,通过Java或者其他脚本语言实现复杂的数据转换逻辑。

3.1 Object to JSON

Object to JSON组件能够将Java对象转换成JSON格式,方便其他语言比如C#,Python解析和使用。常见的使用场景就是将Map对象转换成JSON格式。

Mule UI Config:

1490365-20190803142324640-1061484341.png

Mule XML Config:

<?xml version="1.0" encoding="UTF-8"?><mule xmlns:json="http://www.mulesoft.org/schema/mule/json"xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"xmlns:spring="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="
http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd"><http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/><flow name="object-to-json-flow"><http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="HTTP"/><set-payload value="#[[&quot;orderNo&quot;:&quot;OST0001&quot;,&quot;orderAmount&quot;:1000]]" doc:name="Set Map Payload"/><json:object-to-json-transformer doc:name="Object to JSON"/></flow>
</mule>

使用Postman访问,就可以得到一个标准的JSON数据。

{"orderAmount": 1000,"orderNo": "OST0001"
}

3.2 JSON to XML

JSON转换成XML是很常用的转换操作。JSON和XML都是有层级关系的数据展示结构,JSON和XML具体的区别和使用场景请参考其他文章。这里需要强调是XML有一个唯一的根节点元素,而JSON根节点元素可能是一个对象,还可能是一个数组。使用Mule完成JSON to XML也很简单。

Mule UI Config:

1490365-20190803142335564-216172015.png

Mule XML Config:

<?xml version="1.0" encoding="UTF-8"?><mule xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"xmlns:spring="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd"><http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/><flow name="json2xml-flow"><http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="HTTP"/><json:json-to-xml-transformer doc:name="JSON to XML"/></flow>
</mule>

使用Postman提交Json,Json数据如下:

{"customer": {"cellPhone": "13912340002","customerNo": "C0002","customerName": "Alibaba"}
}

得到转换之后的结果如下:

<?xml version='1.0'?>
<customer><cellPhone>13912340002</cellPhone><customerNo>C0002</customerNo><customerName>Alibaba</customerName>
</customer>

这里还是要再次强调一下,这个组件要求Json数据必须只有一个根节点。如果Json数据里有多个根节点,则数据会丢失。举例如下:

有多个根节点元素的Json数据:

{"cellPhone": "13912340002","customerNo": "C0002","customerName": "Alibaba"
}

转换后的XML结果如下,可以看到只有第一个根元素被转换成了XML。

<?xml version='1.0'?>
<cellPhone>13912340002</cellPhone>

3.3 JSON to Object

这个组件会将JSON数据转成成一个Mule内置的Json对象,org.mule.module.json.JsonData。

Mule UI Config:

1490365-20190803142353651-1126983613.png

Mule XML Config:

<?xml version="1.0" encoding="UTF-8"?><mule xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"xmlns:spring="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd"><http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/><flow name="json2object-flow"><http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="HTTP"/><json:json-to-object-transformer doc:name="JSON to Object"/><logger message="#[message]" level="INFO" doc:name="Logger"/></flow>
</mule>

通过打印的日志可以看到,转化后的payload是org.mule.module.json.JsonData。


org.mule.DefaultMuleMessage
{id=4b3b1290-b293-11e9-9351-005056c00001payload=org.mule.module.json.JsonDatacorrelationId=<not set>correlationGroup=-1correlationSeq=-1encoding=UTF-8exceptionPayload=<not set>
}

3.4 XML to JSON

正如2.2章节所说,XML和Json的根节点元素存在差异。而XML的根节点元素是唯一的,所以XML to JSON比较简单。

Mule UI Config:

1490365-20190803142406073-493708971.png

Mule XML Config:

<?xml version="1.0" encoding="UTF-8"?><mule xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"xmlns:spring="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd"><http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/><flow name="xml2json-flow"><http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="HTTP"/><json:xml-to-json-transformer doc:name="XML to JSON"/></flow>
</mule>

使用Postman提交Xml,Xml数据如下:

<?xml version='1.0'?>
<customer><cellPhone>13912340002</cellPhone><customerNo>C0002</customerNo><customerName>Alibaba</customerName>
</customer>

转化后的JSON数据如下,可以看到这里的Json是正确的。

{"customer": {"cellPhone": "13912340002","customerNo": "C0002","customerName": "Alibaba"}
}

4. 企业版的DataWeave Transformer(可视化高级数据转换器)

DataWeave是Mule企业版提供的可视化的数据换器,使用这个组件可以通过拖拽的操作完成数据的映射。从下图可以看到,DataWeave配合DataSense,通过拖拽连线的方式,可以将Http的请求数据转换成Web Service Consumer期待的Xml数据,非常好用方便。

1490365-20190803142417189-275898636.png

5. 社区版的InfoMapper(自研的可视化数据转换器)

上文提到的DataWeave是Mule企业版才提供的功能,社区版并不提供该组件。我们也可以通过扩展组件的方式达到类似的功能,我们自研的可视化转换组件InfoMapper,其功能和DataWeave相当。

1490365-20190803142426862-871025688.png

数据转换是ESB很常用的功能和使用场景,使用Anypoint Studio中提供的简单数据转换组件,或者企业版的DataWeave,社区版我们自研的InfoMapper这些高级转换组件,配合强大的DataSense,数据转换是非常轻松的事情。

本文同步发文于EnjoyingSoft Blogs ,CSDN,简书

访问EnjoyingSoft 网站,获取更多Mule ESB 社区版 实施帮助。

欢迎转载,但必须保留原文和此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/enjoyingsoft/p/11294702.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

反射和内省_单例设计模式–内省和最佳实践

反射和内省定义&#xff1a; Singleton是“ 四人帮”设计模式的一部分&#xff0c;它属于创新设计模式。 在本文中&#xff0c;我们将更深入地研究Singleton模式的用法。 就建模而言&#xff0c;它是最简单的设计模式之一&#xff0c;但另一方面&#xff0c;就使用的复杂性而言…

福利预告,跳一跳助手即将发布,您不知道还有这些...

福利预告&#xff0c;跳一跳助手即将来临 一周后&#xff0c;即2月9号正式发布 跳一跳助手&#xff0c;免费免费免费提供&#xff01; 透露一下 跳一跳助手的界面是这样滴&#xff1a; 这工具有啥用&#xff1f; 举个栗子&#xff1a; 花城君用该工具&#xff0c;不小心就玩到…

Redis Client Lettuce 5 GA发布

经过13个月的开发阶段和208张已解决的故障单&#xff0c;我很高兴宣布Lettuce 5.0全面上市。 这是一个主要发行版&#xff0c;带有一些重大更改&#xff0c;新的有趣功能以及Java 9兼容性。 从Maven Central获取发布 <dependency><groupId>io.lettuce</groupI…

NOIP模拟测试14「旋转子段·走格子·柱状图」

旋转子段 连60分都没想&#xff0c;考试一直肝t3&#xff0c;t2&#xff0c;没想到t1最简单 我一直以为t1很难&#xff0c;看了题解发现也就那样 题解 性质1 一个包含a[i]旋转区间值域范围最多为min(a[i],i)----max(a[i],i) 感性理解 举个例子,例如3 7 1 4 5 6 2 这个子段包含a…

检测域名是否到期

如果你想做一个网站&#xff0c;首先需要购买一个域名&#xff0c;与其说是购买不如说是租用&#xff0c;因为你要想使用这个域名&#xff0c;每年都需要缴纳一笔费用。既然是租用&#xff0c;所以就有期限&#xff0c;在到期前没有续费&#xff0c;则该域名会被收回&#xff0…

jax-ws cxf_走向REST:在Spring和JAX-RS(Apache CXF)中嵌入Jetty

jax-ws cxf对于服务器核心Java开发人员来说&#xff0c;向世界“展示”的唯一方法是使用API​​。 今天的帖子都是关于JAX-RS的 &#xff1a;使用Java编写和公开RESTful服务。 但是&#xff0c;我们不会使用涉及应用程序服务器&#xff0c;WAR打包以及诸如此类的传统的重量级方…

问题 1046: [编程入门]自定义函数之数字后移

题目描述有n个整数&#xff0c;使前面各数顺序向后移m个位置&#xff0c;最后m个数变成前面m个数。写一函数&#xff1a;实现以上功能&#xff0c;在主函数中输入n个数和输出调整后的n个数。输入输入数据的个数n n个整数 移动的位置m输出移动后的n个数样例输入10 1 2 3 4 5 6 7…

Reliable Multicast Programming(PGM)协议

Reliable Multicast Programming (PGM)实际通用可靠多播协议&#xff0c;在某种程度上保证多播的可靠性。是IP上层协议&#xff0c;和TCP还有UDP同级&#xff0c;工作在传输层。 在组播传输视频项目中&#xff0c;发现在网络较差的时候&#xff0c;组播传输视频性能下降迅猛&am…

P1488 肥猫的游戏

P1488 肥猫的游戏https://www.luogu.org/problem/P1488 博弈论一个三角形&#xff0c;只有三种情况&#xff1a;1邻接&#xff0c;2邻接&#xff0c;3邻接主要是2邻接的情况比较麻烦边<0,n-1>需要特判一下 #include <iostream> #include <cstdio> #include &…

使用OAuth2令牌的安全REST服务

1.简介 在本教程中&#xff0c;我们将介绍如何将Spring Security与OAuth结合使用以保护REST服务。 在演示应用程序中&#xff0c;可以使用路径模式&#xff08; / api / ** &#xff09;访问服务器上受保护的REST资源&#xff0c;以便基于该路径的请求URL映射到不同的控制器方法…

java 内联调用深度_Java中内联虚拟方法调用的性能

java 内联调用深度总览 动态编译的好处之一是它能够支持在虚拟方法代码上的广泛方法内联。 内联代码可提高性能时&#xff0c;代码仍必须检查类型&#xff08;以防由于优化而更改了类型&#xff09;或在多个可能的实现之间进行选择。 这导致了问题。 通过接口调用的方法的多个…

组件切换方式(Vue.js)

这里&#xff0c;我用一个注册登录两组件的切换实例来演示&#xff1a; 切换方式一 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><title>独秀不爱秀</title> </head><body><div …

在GWT中序列化/反序列化Json

JSON和GWT 最近&#xff0c; GWT用户小组中进行了有趣的讨论 &#xff0c;涉及在客户端对JSON进行序列化/反序列化的最佳实践。 这篇文章旨在突出其重点。 到目前为止&#xff0c;在GWT中有三种将对象转换为JSON并从客户端转换回JSON的方法&#xff1a; gwt-jackson框架&#…

NOIP模拟测试15「建造城市city(插板法)·轰炸·石头剪刀布」

建造城市 题解 先思考一个简单问题 10个$toot$ 放进5间房屋&#xff0c;每个房屋至少有1个$toot$&#xff0c;方案数 思考&#xff1a;插板法&#xff0c;$10$个$toot$有$9$个缝隙&#xff0c;$5$间房屋转化为$4$个挡板&#xff0c;放在toot缝隙之间得到$C_{9}^{4}$ 10个$toot$…

弹簧和线程:TaskExecutor

在Web应用程序中使用线程并不常见&#xff0c;尤其是当您必须开发长期运行的任务时。 考虑到spring&#xff0c;我们必须格外注意并使用它已经提供的工具&#xff0c;而不是生成我们自己的线程。 我们希望线程由spring管理&#xff0c;因此能够在不产生任何影响的情况下使用应…

数位dp从会打模板到不会打模板

打了几个数位$dp$&#xff0c;发现自己除了会打模板之外没有任何长进&#xff0c;遇到非模板题依然什么都不会 那么接下来这篇文章将介绍如何打模板&#xff08;滑稽&#xff09; 假设我们要处理$l----r$ 采用记忆化搜索的方式&#xff0c;枚举$<r$每一种情况&#xff0c;枚…

javafx简单吗_JavaFX即将推出您附近的Android或iOS设备吗?

javafx简单吗已经有大新闻最近在世界上的JavaFX的关于JavaFX的是许多更多的组件开源&#xff0c;开源的广告在2012 JavaOne大会 。 在2月的开放源代码更新中 &#xff0c; Richard Bair编写了一份JavaFX项目表&#xff0c;该表在撰写本文时&#xff08;2013年2月11日&#xff0…

【webrtc】webrtc的rtp重传代码分析

pgm不太能用&#xff0c;没有想象中的可靠&#xff0c;重传机制貌似仍然使用组播重传&#xff0c;丢包率80%的网络感觉没啥改进&#xff0c;如果有所好转延迟估计也是个不小的问题。 后听说rtp也有nack机制&#xff0c;webrtc基于rtp实现了重传在一定程度上保证可靠性。 在各路…

了解java.nio.file.Path – 1

介绍 Java的最后几个发行版本&#xff0c;即Java 7&#xff0c;Java 8和即将到来的Java 9&#xff0c;具有许多功能&#xff0c;这些功能使Java开发人员的生活更加轻松。 &#xff08;我知道Java 9会使它变得更困难&#xff0c;但是只有在您采用新的范例时才可以。之后&#xf…

socket-01

对于所有的Web应用&#xff0c;本质上其实就是一个socket服务端&#xff0c;用户的浏览器其实就是一个socket客户端 转载于:https://www.cnblogs.com/yanhuaqiang/p/11329925.html