第39章 Dozer
Dozer コンポーネント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
dozer: コンポーネントは、Dozer マッピングフレームワークを使用して Java Bean 間のマッピング機能を提供します。Camel は、Dzer マッピングを 型コンバーター として トリガーする機能もサポートします。Dozer エンドポイントと Dozer コンバーターの使用の主な相違点は次のとおりです。
- コンバーターレジストリーを介して、エンドポイントごとに Dozer マッピング設定とグローバル設定を管理する機能。
- Dozer エンドポイントは、Camel データ形式を使用して入出力データをマーシャリングまたはアンマーシャリングし、単一の任意の変換エンドポイントをサポートするように設定できます。
- Dozer コンポーネントでは、Dozer のより詳細な統合と拡張を追加機能(たとえば、リテラル値のマッピング、マッピングの式の使用など)することができます。
Dozer コンポーネントを使用するには、Maven ユーザーは以下の依存関係を
pom.xml に追加する必要があります。
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-dozer</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
Camel on EAP デプロイメント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
このコンポーネントは、Red Hat JBoss Enterprise Application Platform (JBoss EAP) コンテナー上で簡素化されたデプロイメントモデルを提供する Camel on EAP (Wildfly Camel) フレームワークによってサポートされます。このモデルの詳細は、Deploying into a Web Server の Apache Camel on JBoss EAP の章を参照してください。
URI 形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Dozer コンポーネントはプロデューサーエンドポイントのみをサポートします。
dozer:endpointId[?options]
ここで、endpointId は、Dozer エンドポイント設定を一意に識別するために使用される名前です。
例:Dozer エンドポイント URI:
from("direct:orderInput").
to("dozer:transformOrder?mappingFile=orderMapping.xml&targetModel=example.XYZOrder").
to("direct:orderOutput");
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
|
名前
|
デフォルト
|
説明
|
|---|---|---|
mappingFile
|
dozerBeanMapping.xml
|
Dozer 設定ファイルの場所。デフォルトでは、ファイルはクラスパスから読み込まれますが、
file:、classpath:、または http: を使用して、特定の場所から設定を読み込むことができます。
|
unmarshalId
|
none
|
Java 以外のタイプからマッピング入力をアンマーシャリングするために使用する Camel Context 内で定義された dataFormat の ID。 |
marshalId
|
none
|
マッピング出力を Java 以外のタイプにマーシャリングするために使用する Camel Context 内で定義された dataFormat の ID。 |
sourceModel
|
none
|
マッピングで使用されるソースタイプの完全修飾クラス名。これが指定されている場合、マッピングへの入力は、Dozer でマッピングされる前に指定された型に変換されます。 |
targetModel
|
none
|
マッピングで使用されるターゲットタイプの完全修飾クラス名。このオプションは必須です。 |
mappingConfiguration
|
none | Dozer マッピングの設定に使用する Camel レジストリーの DozerBeanMapperConfiguration Bean の名前。これは、Dzer の設定方法を詳細に制御するために使用可能な mappingFile オプションの代替手段です。値に "#" 接頭辞を使用して、Bean が Camel レジストリーにあることを示します(例:#myDozerConfig)。 |
Dozer でのデータフォーマットの使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Dozer はマッピングの Java 以外のソースおよびターゲットをサポートしないため、XML ドキュメントを独自の Java オブジェクトにマッピングすることはできません。Camel は Java と データ 形式を使用したさまざまなフォーマットのマーシャリングを広範囲にサポートしています。Dozer コンポーネントは、Dozer を介して処理される前に入出力データをデータ形式で渡すように指定できるため、このサポートを利用します。Dozer への呼び出し外で常にこれを実行できますが、Dozer コンポーネントで直接サポートすることで、単一のエンドポイントを使用して Camel 内で任意の変換を設定できます。
たとえば、Dozer コンポーネントを使用して XML データ構造と JSON データ構造をマッピングしたとします。Camel コンテキストで以下のデータ形式が定義されている場合:
<dataFormats>
<json library="Jackson" id="myjson"/>
<jaxb contextPath="org.example" id="myjaxb"/>
</dataFormats>
その後、Jackson データ形式を使用して入力 XML をアンマーシャリングし、Jackson を使用してマッピング出力をマーシャリングするように Dozer エンドポイントを設定できます。
<endpoint uri="dozer:xml2json?marshalId=myjson&unmarshalId=myjaxb&targetModel=org.example.Order"/>
Dozer の設定 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
すべての Dozer エンドポイントには、ソースおよびターゲットオブジェクト間のマッピングを定義する Dozer マッピング設定ファイルが必要です。mappingFile または mappingConfiguration オプションがエンドポイントで指定されていない場合、コンポーネントは META-INF/dozerBeanMapping.xml の場所にデフォルト設定されます。1 つのエンドポイントに複数のマッピング設定ファイルを提供する必要がある場合、または追加の設定オプション(イベントリスナー、カスタムコンバーターなど)を指定する必要がある場合は、
org.apache.camel.converter.dozer.DozerBeanMapperConfiguration のインスタンスを使用できます。
<bean id="mapper" class="org.apache.camel.converter.dozer.DozerBeanMapperConfiguration">
<property name="mappingFiles">
<list>
<value>mapping1.xml</value>
<value>mapping2.xml</value>
</list>
</property>
</bean>
マッピング拡張機能 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Dozer コンポーネントは、Dozer マッピングフレームワークにカスタムコンバーターとして多くの拡張機能を実装します。これらのコンバーターは、Dzer 自体で直接サポートされていないマッピング関数を実装します。
変数マッピング リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
変数のマッピングにより、Dozer 設定内の変数定義の値をソースフィールドの値を使用する代わりに、ターゲットフィールドにマップできます。これは、他のマッピングフレームワークの定数マッピングと同等で、はリテラル値をターゲットフィールドに割り当てることができます。変数マッピングを使用するには、マッピング設定で変数を定義し、VariableMapper クラスから選択したターゲットフィールドにマップします。
<mappings xmlns="http://dozer.sourceforge.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net http://dozer.sourceforge.net/schema/beanmapping.xsd">
<configuration>
<variables>
<variable name="CUST_ID">ACME-SALES</variable>
</variables>
</configuration>
<mapping>
<class-a>org.apache.camel.component.dozer.VariableMapper</class-a>
<class-b>org.example.Order</class-b>
<field custom-converter-id="_variableMapping" custom-converter-param="${CUST_ID}">
<a>literal</a>
<b>custId</b>
</field>
</mapping>
</mappings>
カスタムマッピング リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
カスタムマッピングにより、ソースフィールドがターゲットフィールドにマップされる方法についての独自のロジックを定義できます。Dozer のカスタマーコンバーターと機能的に似ており、以下の 2 つの相違点があります。
- カスタムマッピングを持つ単一のクラスに複数のコンバーターメソッドを設定できます。
- カスタムマッピングを使用して Dozer 固有のインターフェイスを実装する必要はありません。
カスタムマッピングは、マッピング設定で組み込みの '_customMapping' コンバーターを使用して宣言されます。このコンバーターの パラメーターの構文は以下のとおりです。
[class-name][,method-name]
メソッド名はオプションです。Dozer コンポーネントは、マッピングに必要な入出力タイプに一致するメソッドを検索します。カスタムマッピングと設定の例を以下に示します。
public class CustomMapper {
// All customer ids must be wrapped in "[ ]"
public Object mapCustomer(String customerId) {
return "[" + customerId + "]";
}
}
<mappings xmlns="http://dozer.sourceforge.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net http://dozer.sourceforge.net/schema/beanmapping.xsd">
<mapping>
<class-a>org.example.A</class-a>
<class-b>org.example.B</class-b>
<field custom-converter-id="_customMapping"
custom-converter-param="org.example.CustomMapper,mapCustomer">
<a>header.customerNum</a>
<b>custId</b>
</field>
</mapping>
</mappings>
式マッピング リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
式マッピングを使用すると、Camel の強力な 言語 機能を使用して式を評価し、結果をマッピングのターゲットフィールドに割り当てることができます。Camel がサポートする言語は、式マッピングで使用できます。式の基本的な例には、Camel メッセージヘッダーまたはエクスチェンジプロパティーをターゲットフィールドにマップしたり、複数のソースフィールドをターゲットフィールドに連結したりする機能が含まれます。マッピング式の構文は次のとおりです。
[language]:[expression]
メッセージヘッダーをターゲットフィールドにマップする例:
<mappings xmlns="http://dozer.sourceforge.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net http://dozer.sourceforge.net/schema/beanmapping.xsd">
<mapping>
<class-a>org.apache.camel.component.dozer.ExpressionMapper</class-a>
<class-b>org.example.B</class-b>
<field custom-converter-id="_expressionMapping" custom-converter-param="simple:\${header.customerNumber}">
<a>expression</a>
<b>custId</b>
</field>
</mapping>
</mappings>
Dozer が EL を使用して定義された変数値を解決しようとするとエラーを防ぐために、式内のプロパティーを "\" でエスケープする必要があります。
Dozer 型変換 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Dozer コンポーネントは、Dozer Mapping フレームワークを使用して Java Bean 間のマッピング機能を提供します。ただし、Camel は Dozer マッピングを型コンバーターとしてトリガーする機能もサポートします。
CamelContext camelctx = new DefaultCamelContext();
camelctx.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start").convertBodyTo(CustomerB.class);
}
});
DozerBeanMapperConfiguration mconfig = new DozerBeanMapperConfiguration();
mconfig.setMappingFiles(Arrays.asList(new String[] { "mappings.xml" }));
new DozerTypeConverterLoader(camelctx, mconfig);