10.6. トランスフォーマー
トランスフォーマーは、ルート定義で宣言された Input Type
や Output Type
に従って、メッセージの宣言的な変換を実行します。デフォルトの Camel メッセージは DataTypeAware
を実装します。これは DataType
で表されるメッセージタイプを保持します。
10.6.1. トランスフォーマーの仕組み
ルート定義は Input Type
や Output Type
を宣言します。Input Type
や Output Type
がランタイムのメッセージタイプと異なる場合、Camel 内部プロセッサーはトランスフォーマーを検索します。トランスフォーマーは現在のメッセージタイプを予想されるメッセージタイプに変換します。メッセージが正常に変換されたり、メッセージが想定されるタイプである場合は、メッセージデータタイプが更新されます。
10.6.1.1. データタイプフォーマット
データタイプのフォーマットは scheme:name
です。scheme は、java
、xml
または json
といったデータモデルのタイプで、name はデータタイプ名です。
scheme のみを指定すると、そのスキームですべてのデータタイプと一致します。
10.6.1.2. サポート対象のトランスフォーマー
トランスフォーマー | 説明 |
---|---|
データフォーマットトランスフォーマー | データフォーマットを使用した変換 |
エンドポイントトランスフォーマー | エンドポイントを使用した変換 |
カスタムトランスフォーマー | カスタムトランスフォーマークラスを使用した変換。 |
10.6.1.3. 共通オプション
すべてのトランスフォーマーには、トランスフォーマーでサポートされるデータタイプを指定するための以下の共通のオプションがあります。
scheme
または fromType
および toType
の両方を指定する必要があります。
名前 | 説明 |
---|---|
scheme |
|
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>