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 是数据模型的类型,如 javaxmljsonname 是数据类型名称。

注意

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

10.6.1.2. 支持的转换

转换程序描述

数据格式转换器

使用数据格式转换

endpoint Transformer

使用 Endpoint 转换

Custom Transformer

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

10.6.1.3. 常见选项

所有转换程序都有以下通用选项,用来指定由转换器支持的数据类型。

重要

必须指定 schemefromTypetoType

名称描述

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 中指定 endpoint ref 的示例:

<transformers>
<endpointTransformer ref="myDozerEndpoint" fromType="xml" toType="json"/>
</transformers>

10.6.3. 自定义转换器选项

注意

转换程序必须是 org.apache.camel.spi.Transformer的子类

名称描述

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>
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.