Camel CSV 组件未正确输出 Headers
Camel CSV Component Not Outputting Headers Correctly
我有以下 2.14.1 路线:
from("activemq:queue:ABC_FULFILLMENT_REQUEST")
.aggregate(new ABCFulfillmentCenterAggregationStrategy())
.xpath(
"/o:Order/o:OrderType/o:FulfillmentCenter = '"
+ com.pluralsight.orderfulfillment.generated.FulfillmentCenter.FULFILLMENT_CENTER_ONE.value()
+ "'", Boolean.class, namespace)
.completionInterval(10000)
.beanRef("aBCFulfillmentProcessor", "processAggregate").marshal()
.csv().to("file://" + filePath).to("mock:direct:result");
我的聚合策略关联 XML,其中 fulfillmentcenter 元素的文本具有特定值。这工作正常。然后我的消息翻译器接受交换并处理它:
public List<Map<String, Object>> processAggregate(List orders) throws Exception {
log.info("Processing the aggregate");
List<Map<String, Object>> results = new ArrayList<Map<String, Object>>();
// 1 - Add the header first
Map<String, Object> header = new HashMap<String, Object>();
header.put("orderNumber", "Order Number");
header.put("firstName", "First Name");
header.put("lastName", "Last Name");
results.add(header);
try {
if (orders != null) {
// 2 - Add each order ID
for (int i = 0; i < orders.size(); i++) {
com.pluralsight.orderfulfillment.generated.Order order = unmarshallOrder((String) orders
.get(i));
Map<String, Object> row = new HashMap<String, Object>();
row.put("orderNumber", order.getOrderType().getOrderNumber());
row.put("firstName", order.getOrderType().getFirstName());
row.put("lastname", order.getOrderType().getLastName());
results.add(row);
}
}
} catch (Exception e) {
log.error(
"An error occurred while trying to process messages for the abc fulfillment center: "
+ e.getMessage(), e);
throw e;
}
return results;
}
如您所见,我正在接受订单列表作为来自交易所 body 的参数。首先,我将 header 添加到我计划 return 的地图列表中。然后我从输入列表中解组每个 XML 并构建映射以添加到 return 列表。
消息处理完成后,我将结果编组为 CSV,然后将内容发送到文件。
导致下面body的内容是:
姓氏,订单号,名字
,1003,简,史密斯
,1004,拉里,马
,1005,迈克尔,测试员
我希望 header 的顺序正确;然而,它不是。另外,一个额外的逗号被输出到左边。现在,如果我不为 header 添加地图,我会得到以下信息:
1003,史密斯,简
1004,马,拉里
1005,测试员,迈克尔
这是我的问题:
编组 csv 然后将交换发送到文件是一种可接受的方法吗?或者我应该在 csv 和文件组件之间使用一些其他组件。
如何保持一行中元素的顺序。例如,我想确保列是订单号、名字、姓氏;但是,地图键不是我想要确保顺序的方式。任何指导将不胜感激。
如果还有什么我可以提供的,请告诉我。预先感谢您的帮助。
要保持行中元素的顺序,请改用 LinkedHashMap。
例如:
Map<String, Object> header = new LinkedHashMap<String, Object>();
其余的路线没问题,当你修复使用的地图时你会得到预期的结果(没有额外的逗号等)
我有以下 2.14.1 路线:
from("activemq:queue:ABC_FULFILLMENT_REQUEST")
.aggregate(new ABCFulfillmentCenterAggregationStrategy())
.xpath(
"/o:Order/o:OrderType/o:FulfillmentCenter = '"
+ com.pluralsight.orderfulfillment.generated.FulfillmentCenter.FULFILLMENT_CENTER_ONE.value()
+ "'", Boolean.class, namespace)
.completionInterval(10000)
.beanRef("aBCFulfillmentProcessor", "processAggregate").marshal()
.csv().to("file://" + filePath).to("mock:direct:result");
我的聚合策略关联 XML,其中 fulfillmentcenter 元素的文本具有特定值。这工作正常。然后我的消息翻译器接受交换并处理它:
public List<Map<String, Object>> processAggregate(List orders) throws Exception {
log.info("Processing the aggregate");
List<Map<String, Object>> results = new ArrayList<Map<String, Object>>();
// 1 - Add the header first
Map<String, Object> header = new HashMap<String, Object>();
header.put("orderNumber", "Order Number");
header.put("firstName", "First Name");
header.put("lastName", "Last Name");
results.add(header);
try {
if (orders != null) {
// 2 - Add each order ID
for (int i = 0; i < orders.size(); i++) {
com.pluralsight.orderfulfillment.generated.Order order = unmarshallOrder((String) orders
.get(i));
Map<String, Object> row = new HashMap<String, Object>();
row.put("orderNumber", order.getOrderType().getOrderNumber());
row.put("firstName", order.getOrderType().getFirstName());
row.put("lastname", order.getOrderType().getLastName());
results.add(row);
}
}
} catch (Exception e) {
log.error(
"An error occurred while trying to process messages for the abc fulfillment center: "
+ e.getMessage(), e);
throw e;
}
return results;
}
如您所见,我正在接受订单列表作为来自交易所 body 的参数。首先,我将 header 添加到我计划 return 的地图列表中。然后我从输入列表中解组每个 XML 并构建映射以添加到 return 列表。
消息处理完成后,我将结果编组为 CSV,然后将内容发送到文件。
导致下面body的内容是:
姓氏,订单号,名字 ,1003,简,史密斯 ,1004,拉里,马 ,1005,迈克尔,测试员
我希望 header 的顺序正确;然而,它不是。另外,一个额外的逗号被输出到左边。现在,如果我不为 header 添加地图,我会得到以下信息:
1003,史密斯,简 1004,马,拉里 1005,测试员,迈克尔
这是我的问题:
编组 csv 然后将交换发送到文件是一种可接受的方法吗?或者我应该在 csv 和文件组件之间使用一些其他组件。
如何保持一行中元素的顺序。例如,我想确保列是订单号、名字、姓氏;但是,地图键不是我想要确保顺序的方式。任何指导将不胜感激。
如果还有什么我可以提供的,请告诉我。预先感谢您的帮助。
要保持行中元素的顺序,请改用 LinkedHashMap。 例如:
Map<String, Object> header = new LinkedHashMap<String, Object>();
其余的路线没问题,当你修复使用的地图时你会得到预期的结果(没有额外的逗号等)