46.14.2. アンマーシャリング
from("file://inbox") .unmarshal(bindy) .to("direct:handleOrders");
または、Spring XML ファイルなどのレジストリーで定義できるデータ形式への名前付き参照を使用することもできます。
from("file://inbox") .unmarshal("myBindyDataFormat") .to("direct:handleOrders");
Camel ルートは inbox ディレクトリーのファイルを取得して、CSV レコードをモデルオブジェクトのコレクションにアンマーシャリングし、コレクションを 'handleOrders' で参照されるルートに送信します。
返されるコレクションは Map オブジェクトの一覧 です。一覧内の各マップには、CSV の各行からマーシャリングされたモデルオブジェクトが含まれます。これは、各行が複数のオブジェクトに対応する可能性 がある理由です。これは、1 行ごとに 1 つのオブジェクトが返されることが予想される場合に混乱を生じさせる可能性があります。
各オブジェクトは、クラス名を使用して取得できます。
List<Map<String, Object>> unmarshaledModels = (List<Map<String, Object>>) exchange.getIn().getBody(); int modelCount = 0; for (Map<String, Object> model : unmarshaledModels) { for (String className : model.keySet()) { Object obj = model.get(className); LOG.info("Count : " + modelCount + ", " + obj.toString()); } modelCount++; } LOG.info("Total CSV records received by the csv bean : " + modelCount);
ルートの処理のためにこのマップから単一の Order オブジェクトを抽出する場合、以下のように Splitter と Processor の組み合わせを使用できます。
from("file://inbox") .unmarshal(bindy) .split(body()) .process(new Processor() { public void process(Exchange exchange) throws Exception { Message in = exchange.getIn(); Map<String, Object> modelMap = (Map<String, Object>) in.getBody(); in.setBody(modelMap.get(Order.class.getCanonicalName())); } }) .to("direct:handleSingleOrder") .end();
Bindy は、Exchange インターフェースで CHARSET_NAME プロパティーまたは CHARSET_NAME ヘッダーを使用して、アンマーシャリング用に受信された入力ストリームの文字セット変換を行うことに注意してください。プロデューサーによっては(例: file-endpoint)、文字セットを定義できます。文字セット変換は、このプロデューサーによりすでに実行されています。エクスチェンジからこのプロパティーまたはヘッダーを削除してから、アンマーシャリングに送信する必要があります。これを削除しないと、変換が 2 回実行される可能性があり、不要な結果が発生する可能性があります。
from("file://inbox?charset=Cp922") .removeProperty(Exchange.CHARSET_NAME) .unmarshal("myBindyDataFormat") .to("direct:handleOrders");