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