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

注意

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

10.6.1.2. 支持的 Transformers

转换程序描述

数据格式转换

使用数据格式转换

端点转换

使用端点转换

自定义 Transformer

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

10.6.1.3. 常见选项

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

重要

必须指定 schemefromTypetoType

Name描述

scheme

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

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

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.