驼峰CSV组件未正确输出标题

驼峰CSV组件未正确输出标题,csv,apache-camel,Csv,Apache Camel,我有以下2.14.1路线: from("activemq:queue:ABC_FULFILLMENT_REQUEST") .aggregate(new ABCFulfillmentCenterAggregationStrategy()) .xpath( "/o:Order/o:OrderType/o:FulfillmentCenter = '"

我有以下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;
}
public List processAggregate(列表顺序)引发异常{
log.info(“处理聚合”);
列表结果=新建ArrayList();
//1-首先添加标题
Map header=newhashmap();
页眉.put(“订单号”、“订单号”);
标题。put(“名字”、“名字”);
header.put(“lastName”、“lastName”);
结果.添加(标题);
试一试{
如果(订单!=null){
//2-添加每个订单ID
对于(int i=0;i
如您所见,我接受订单列表作为交换主体的参数。首先,我在计划返回的地图列表中添加一个标题。然后,我从输入列表中解组每个XML,并构建映射以添加到返回列表中

消息处理完成后,我将结果整理成CSV,然后将内容发送到文件中

产生以下正文的内容是:

姓氏、订单号、名字 ,1003,简,史密斯 ,1004,拉里,马 ,1005,迈克尔,测试员

我希望标题的顺序是正确的;但事实并非如此。此外,左侧还会输出一个额外的逗号。现在,如果我不为标题添加贴图,我会得到以下结果:

1003,史密斯,简 1004,马,拉里 1005,测试员,迈克尔

以下是我的问题:

  • 整理csv然后将交换发送到文件是一种可接受的方法吗?或者我应该在csv和文件组件之间使用其他组件

  • 如何维护行中元素的顺序。例如,我想确保列是订单号、名字、姓氏;然而,地图键不是我想要确保秩序的方式。任何指导都将不胜感激


  • 如果还有什么我可以提供的,请告诉我。提前感谢您的帮助

    要保持行中元素的顺序,请改用LinkedHashMap。 例如:

    Map<String, Object> header = new LinkedHashMap<String, Object>();
    
    Map header=newlinkedhashmap();
    

    路线的其余部分没有问题,当您修复所使用的地图时(没有额外的逗号等)

    改进,但仍然在值行中获得额外的逗号:订单号、名字、姓氏1003、Jane、Smith 1004、Larry、Horse 1005、Michael、Tester。我使用的lastName键必须是正确的大小写(使用lastName而不是lastName)。都修好了!谢谢