骆驼:奇怪的convertBodyTo行为在不同的系统上

时间:2016-01-14 15:38:48

标签: mongodb apache-camel bson

适用于oracle-7-jdk上的icedtea-7-jdkGentoo linux kernel: 4.3.3-gentoo

     .marshal().json(JsonLibrary.Jackson)                                                                                                                                                                                                             
     .setBody().jsonpath("$.listing")                                                                                                                                                                                                                 
    .process(new Processor(){                                                                                                                                                                                                                         
            @Override                                                                                                                                                                                                                                 
            public void process(Exchange ex){                                                                                                                                                                                                         
                LinkedHashMap<String, Object> map = (LinkedHashMap)ex.getIn().getBody();                                                                                                                                                              
                map.put("_id", (Integer)map.get("id"));                                                                                                                                                                                               
                map.remove("id");                                                                                                                                                                                                                     
            }                                                                                                                                                                                                                                         
        })                                                                                                                                                                                                                                            
    .marshal().json(JsonLibrary.Jackson)                                                                                                                                                                                                              
    .convertBodyTo(String.class)                                                                                                                                                                                                                      
    .to("mongodb:mongoBean?database=myDB&collection=myCol&operation=save");

Ubuntu 14.4openjdk-7-jre上的相同内容不起作用 这些东西也不起作用:

     .marshal().json(JsonLibrary.Jackson)                                                                                                                                                                                                             
     .setBody().jsonpath("$.listing")                                                                                                                                                                                                                 
    .process(new Processor(){                                                                                                                                                                                                                         
            @Override                                                                                                                                                                                                                                 
            public void process(Exchange ex){                                                                                                                                                                                                         
                LinkedHashMap<String, Object> map = (LinkedHashMap)ex.getIn().getBody();                                                                                                                                                              
                map.put("_id", (Integer)map.get("id"));                                                                                                                                                                                               
                map.remove("id");                                                                                                                                                                                                                     
            }                                                                                                                                                                                                                                         
        })                                                                                                                                                                                                                                            
    .marshal().json(JsonLibrary.Jackson)                                                                                                                                                                                                              
    .convertBodyTo(String.class)                                                                                                                                                                                                                      
    .bean(org.bson.Document.class, "parse(${body})")                                                                                                                                                                                                  
    .to("mongodb:mongoBean?database=myDB&collection=myCol&operation=save");

在保存到Mongo之前,请考虑我已添加.bean(org.bson.Document.class,"parse(${body})")

原因是什么?

更新1

使用Camel 2.16.1,没有容器。

第一个代码块抛出:

Caused by: org.apache.camel.InvalidPayloadException: No body available of type: com.mongodb.DBObject but has value: {"city":"Los Angeles","distance":null,....

第二个代码块抛出:

 Caused by: org.apache.camel.NoTypeConversionAvailableException: No type converter available to convert from type: org.bson.Document to the required type: com.mongodb.DBObject

更新2

对我有用的最终解决方案是:

     .marshal().json(JsonLibrary.Jackson)                                                                                                                                                                                                             
     .setBody().jsonpath("$.listing")                                                                                                                                                                                                                 
    .process(new Processor(){                                                                                                                                                                                                                         
            @Override                                                                                                                                                                                                                                 
            public void process(Exchange ex){                                                                                                                                                                                                         
                LinkedHashMap<String, Object> map = (LinkedHashMap)ex.getIn().getBody();                                                                                                                                                              
                map.put("_id", (Integer)map.get("id"));                                                                                                                                                                                               
                map.remove("id");                                                                                                                                                                                                                     

                Iterator<String> i = map.keySet().iterator();                                                                                                                                                                                         
                while(i.hasNext()){                                                                                                                                                                                                                   
                    String key = i.next();                                                                                                                                                                                                            
                    if(map.get(key) instanceof java.math.BigDecimal){                                                                                                                                                                                 
                        map.put(key, map.get(key).toString());                                                                                                                                                                                        
                    }                                                                                                                                                                                                                                 
                }                                                                                                                                                                                                                                     
            }                                                                                                                                                                                                                                         
        })                                                                                                                                                                                                                                            
    .convertBodyTo(com.mongodb.DBObject.class)                                                                                                                                                                                                        
    .to("mongodb:mongoBean?database=airbnb&collection=appartments&operation=save");   

我收到了No type converter available的{​​{1}};

更新3

多个环境之间没有区别。我假设java.math.BigDecimal工作但是uberjar在mvn exec:java的帮助下组装并没有因组件启动和(可能)类型转换器注册的某些差异而导致。

1 个答案:

答案 0 :(得分:1)

如果您的身体中有Map,则应该能够将其直接传递到camel-mongodb端点,因为该组件执行必要的类型转换以进行转换:

  • Map =&gt; DBObject(MongoDB&#39;必需类型)。
  • String =&gt; DBObject
  • File =&gt; DBObject
  • InputStream =&gt; DBObject
  • 任何其他对象=&gt; DBObject使用杰克逊先将其转换为Map,然后转换为BasicDBObject

查看available type conversions

您可以尝试跳过JSON和convertBodyTo的编组吗?但请确保在类路径中保留camel-jackson +依赖项。