10.6. transformer
转换器根据路由定义上的声明的输入类型和/或输出类型执行消息声明性转换。 默认 camel 消息实现 DataTypeAware,其中包含 DataType 表示的消息类型。
10.6.1. Transformer 的工作原理? 复制链接链接已复制到粘贴板!
路由定义声明 输入类型和 /或 输出类型。如果输入类型和/或 输出类型 与运行时的消息类型不同,则 camel 内部处理器会查找 Transformer。Transformer 将当前消息类型转换为预期的消息类型。当消息被成功转换后,或者消息已处于预期类型后,则会更新消息数据类型。
10.6.1.1. 数据类型格式 复制链接链接已复制到粘贴板!
数据类型格式为 scheme:name,其中 scheme 是 java、xml 或 json 等数据模型类型,name 是数据类型名称。
如果您只指定 方案,则它会与该方案的所有数据类型匹配。
10.6.1.2. 支持的 Transformer 复制链接链接已复制到粘贴板!
| transformer | 描述 |
|---|---|
| Data Format Transformer | 使用 Data Format 转换 |
| endpoint Transformer | 使用 Endpoint 转换 |
| custom Transformer | 使用自定义转换器类转换。 |
10.6.1.3. 常见选项 复制链接链接已复制到粘贴板!
所有转换器都有以下常用选项,通过转换器指定受支持的数据类型。
必须指定 从Type 和 toType 的 方案。
10.6.1.4. DataFormat Transformer 选项 复制链接链接已复制到粘贴板!
| 名称 | 描述 |
|---|---|
| type | 数据格式类型 |
| ref | 引用数据格式 ID |
指定 bindy DataFormat 类型的示例:
Java DSL:
XML DSL:
<dataFormatTransformer fromType="java:com.example.Order" toType="csv:CSVOrder">
<bindy id="csvdf" type="Csv" classType="com.example.Order"/>
</dataFormatTransformer>
<dataFormatTransformer fromType="java:com.example.Order" toType="csv:CSVOrder">
<bindy id="csvdf" type="Csv" classType="com.example.Order"/>
</dataFormatTransformer>
10.6.2. endpoint Transformer 选项 复制链接链接已复制到粘贴板!
| 名称 | 描述 |
|---|---|
| ref | 引用端点 ID |
| uri | 端点 URI |
在 Java DSL 中指定端点 URI 的示例:
transformer()
.fromType("xml")
.toType("json")
.withUri("dozer:myDozer?mappingFile=myMapping.xml...");
transformer()
.fromType("xml")
.toType("json")
.withUri("dozer:myDozer?mappingFile=myMapping.xml...");
在 XML DSL 中指定端点 ref 的示例:
<transformers> <endpointTransformer ref="myDozerEndpoint" fromType="xml" toType="json"/> </transformers>
<transformers>
<endpointTransformer ref="myDozerEndpoint" fromType="xml" toType="json"/>
</transformers>
10.6.3. custom Transformer 选项 复制链接链接已复制到粘贴板!
转换器必须是 org.apache.camel.spi.Transformer的子类
| 名称 | 描述 |
|---|---|
| ref | 引用自定义 Transformer bean ID |
| className | 自定义 Transformer 类的完全限定类名称 |
指定 custom Transformer 类的示例:
Java DSL:
transformer()
.fromType("xml")
.toType("json")
.withJava(com.example.MyCustomTransformer.class);
transformer()
.fromType("xml")
.toType("json")
.withJava(com.example.MyCustomTransformer.class);
XML DSL:
<transformers> <customTransformer className="com.example.MyCustomTransformer" fromType="xml" toType="json"/> </transformers>
<transformers>
<customTransformer className="com.example.MyCustomTransformer" fromType="xml" toType="json"/>
</transformers>
10.6.4. 转换器示例 复制链接链接已复制到粘贴板!
这个示例分为两个部分,第一部分声明了 Endpoint Transformer,它转换了消息。第二部分演示了转换程序如何应用到路由。
10.6.4.1. 第 I 部分 复制链接链接已复制到粘贴板!
声明使用 xslt 组件从 xml:ABCOrder 转换为 xml:XYZOrder 的 Endpoint Transformer。
Java DSL:
transformer()
.fromType("xml:ABCOrder")
.toType("xml:XYZOrder")
.withUri("xslt:transform.xsl");
transformer()
.fromType("xml:ABCOrder")
.toType("xml:XYZOrder")
.withUri("xslt:transform.xsl");
XML DSL:
10.6.4.2. 第 II 部分 复制链接链接已复制到粘贴板!
当 direct:abc 端点发送消息来 direct:abc 端点将上述转换程序应用于以下路由定义:
Java DSL:
XML DSL: