10.6. transformer

转换器根据路由定义上的声明的输入类型和/或输出类型执行消息声明性转换。 默认 camel 消息实现 DataTypeAware,其中包含 DataType 表示的消息类型。

10.6.1. Transformer 的工作原理?

路由定义声明 输入类型和 /或 输出类型。如果输入类型和/或 输出类型 与运行时的消息类型不同,则 camel 内部处理器会查找 Transformer。Transformer 将当前消息类型转换为预期的消息类型。当消息被成功转换后,或者消息已处于预期类型后,则会更新消息数据类型。

10.6.1.1. 数据类型格式

数据类型格式为 scheme:name,其中 schemejavaxmljson 等数据模型类型,name 是数据类型名称。

注意

如果您只指定 方案,则它会与该方案的所有数据类型匹配。

10.6.1.2. 支持的 Transformer

transformer描述

Data Format Transformer

使用 Data Format 转换

endpoint Transformer

使用 Endpoint 转换

custom Transformer

使用自定义转换器类转换。

10.6.1.3. 常见选项

所有转换器都有以下常用选项,通过转换器指定受支持的数据类型。

重要

必须指定 从TypetoType方案

名称描述

scheme

xmljson 等数据模型类型。例如,如果指定了 xml,则转换程序将适用于所有 java -> xml 和 xml -> java 转换。

fromType

从中 转换的数据类型。

toType

转换为的数据类型。

10.6.1.4. DataFormat Transformer 选项

名称描述

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 选项

名称描述

ref

引用端点 ID

uri

端点 URI

在 Java DSL 中指定端点 URI 的示例:

transformer()
    .fromType("xml")
    .toType("json")
    .withUri("dozer:myDozer?mappingFile=myMapping.xml...");

在 XML DSL 中指定端点 ref 的示例:

<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);

XML DSL:

<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");

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:abc 端点将上述转换程序应用于以下路由定义:

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>