10.6. トランスフォーマー

トランスフォーマーは、ルート定義で宣言された Input TypeOutput Type に従って、メッセージの宣言的な変換を実行します。デフォルトの Camel メッセージは DataTypeAware を実装します。これは DataType で表されるメッセージタイプを保持します。

10.6.1. トランスフォーマーの仕組み

ルート定義は Input TypeOutput Type を宣言します。Input TypeOutput Type がランタイムのメッセージタイプと異なる場合、Camel 内部プロセッサーはトランスフォーマーを検索します。トランスフォーマーは現在のメッセージタイプを予想されるメッセージタイプに変換します。メッセージが正常に変換されたり、メッセージが想定されるタイプである場合は、メッセージデータタイプが更新されます。

10.6.1.1. データタイプフォーマット

データタイプのフォーマットは scheme:name です。scheme は、javaxml または json といったデータモデルのタイプで、name はデータタイプ名です。

注記

scheme のみを指定すると、そのスキームですべてのデータタイプと一致します。

10.6.1.2. サポート対象のトランスフォーマー

トランスフォーマー説明

データフォーマットトランスフォーマー

データフォーマットを使用した変換

エンドポイントトランスフォーマー

エンドポイントを使用した変換

カスタムトランスフォーマー

カスタムトランスフォーマークラスを使用した変換。

10.6.1.3. 共通オプション

すべてのトランスフォーマーには、トランスフォーマーでサポートされるデータタイプを指定するための以下の共通のオプションがあります。

重要

scheme または fromType および toType の両方を指定する必要があります。

名前説明

scheme

xml または json などのデータモデルのタイプ。たとえば、xml が指定されている場合は、トランスフォーマーがすべての java -> xml および xml -> java 変換に適用されます。

fromType

変換元の Data type

toType

変換する Data type

10.6.1.4. DataFormat トランスフォーマーオプション

名前説明

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. エンドポイントトランスフォーマーオプション

名前説明

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. カスタムトランスフォーマーオプション

注記

トランスフォーマーは org.apache.camel.spi.Transformer のサブクラスである必要があります。

名前説明

ref

カスタムトランスフォーマー Bean ID への参照

className

カスタムトランスフォーマークラスの完全修飾クラス名

カスタムトランスフォーマークラスを指定する例:

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. トランスフォーマーの例

この例は 2 つの部分があり、最初の部分はメッセージを変換するエンドポイントトランスフォーマーを宣言します。2 番目の部分は、トランスフォーマーをルートに適用する方法を示します。

10.6.4.1. 最初の部分

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. 2 番目の部分

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>