10.6. 转换程序
转换程序根据路由定义上声明的 Input Type
和/或 Output Type
来执行消息的声明转换。默认 camel 消息实现 DataTypeAware
,它保存由 DataType
表示的消息类型。
10.6.1. Transformer 的工作原理?
路由定义声明 Input Type
和/或 Output 类型
。如果 Input Type
和/或 Output Type
在运行时与消息类型不同,camel 内部处理器会查找 Transformer。Transformer 将当前消息类型转换为预期的消息类型。一旦消息被成功转换,或者消息已经处于预期类型中后,则会更新消息数据类型。
10.6.1.1. 数据类型格式
数据类型的格式是 scheme:name
,其中 scheme 是数据模型的类型,如 java
、xml
或 json
,name 是数据类型名称。
如果您只指定 scheme,则它将所有数据类型与该方案匹配。
10.6.1.2. 支持的 Transformers
转换程序 | 描述 |
---|---|
数据格式转换 | 使用数据格式转换 |
端点转换 | 使用端点转换 |
自定义 Transformer | 使用自定义转换器类转换。 |
10.6.1.3. 常见选项
所有转换程序都有以下通用选项来指定转换器支持的数据类型。
必须指定 scheme
或 fromType
和 toType
。
Name | 描述 |
---|---|
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. 端点转换选项
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>