55.4.2. unmarshaling
from("file://inbox") .unmarshal(bindy) .to("direct:handleOrders");
另外,您可以使用命名的引用来指代数据格式,然后可以在 Registry 中定义,如 Spring XML 文件:
from("file://inbox") .unmarshal("myBindyDataFormat") .to("direct:handleOrders");
Camel 路由将在box 目录中提取文件,unmarshall CSV 记录为模型对象的集合,并将集合
发送到 handleOrders
所引用的路由。
返回的集合是一个 Map 对象列表。列表中的每个映射都包含在 CSV 每行中汇总的模型对象。其背后的原因是 每行可以对应于多个对象。当您只期望一行返回一个对象时,这可能会造成混淆。
每个对象都可以使用其类名称来检索。
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 使用 CHARSET_NAME 属性或 CHARSET_NAME 标头(在 Exchange 界面中定义)来进行为 unmarshalling 收到的输入流的字符转换。在某些制作者(如 file-endpoint)中,您可以定义字符集。此制作者已经实现的字符集转换。有时,您需要在交换中删除此属性或标头,然后将其发送到 unmarshal。如果您没有删除转换,则可能需要两次执行转换可能会导致不必要的结果。
from("file://inbox?charset=Cp922") .removeProperty(Exchange.CHARSET_NAME) .unmarshal("myBindyDataFormat") .to("direct:handleOrders");