48.15.2. unmarshaling
from("file://inbox")
.unmarshal(bindy)
.to("direct:handleOrders");
另外,您可以使用命名引用数据格式,然后在 registry 中(例如您的 Spring XML 文件)定义:
from("file://inbox")
.unmarshal("myBindyDataFormat")
.to("direct:handleOrders");
Camel 路由将提取 inbox 目录中的文件,将未编出 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();
请特别注意"绑定"使用 CHARSET_NAME 属性或 CHARSET_NAME 标头,如在 Exchange 接口中定义的字符转换,以进行为未编出的输入流的字符转换。在一些制作者(如 file-endpoint)中,您可以定义字符集。这个制作者可能已经完成字符集转换。有时您需要从交换中删除此属性或标头,然后再将其发送到 unmarshal。如果您没有删除转换,则转换可能会失败两次,这可能会导致不必要的结果。
from("file://inbox?charset=Cp922")
.removeProperty(Exchange.CHARSET_NAME)
.unmarshal("myBindyDataFormat")
.to("direct:handleOrders");