2016-01-14 71 views
0

這個工程上oracle-7-jdkicedtea-7-jdkGentoo linux kernel: 4.3.3-gentoo奇怪convertBodyTo行爲:駱駝:在不同的系統

 .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})")

是什麼原因?

UPDATE 1

使用駱駝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 availablejava.math.BigDecimal;

更新3

有多個環境之間沒有什麼區別。我假設mvn exec:java工作,但uberjar在maven-shade-plugin的幫助下組裝並不是因爲組件啓動和(可能)類型轉換器註冊的一些差異。

+0

是什麼例外?你在'oracle-7-jdk','icedtea-7-jdk'上試過了你的第二個代碼塊嗎?你使用的是什麼版本的駱駝?在哪個容器? – raulk

+0

對不起,把更新。 – Archer

回答

1

如果你在你的身體Map,你應該能夠直接傳遞到camel-mongodb端點組件進行必要的類型轉換,從轉換:

  • Map =>DBObject(MongoDB的需要類型)。
  • String =>DBObject
  • File =>DBObject
  • InputStream =>DBObject
  • 其他任何對象=>DBObject使用Jackson將其先轉換爲Map,然後轉換爲BasicDBObject

查看available type conversions

你可以嘗試跳過編組到JSON和convertBodyTo?不過,請確保你的類路徑中保留了camel-jackson +依賴項。

+0

剛剛玩過它,但遇到了另一種問題。 BigDecimal默認沒有類型轉換器。改進的升技,現在會放入'UPD2'。 謝謝。 – Archer

+0

酷!你的意思是傑克遜沒有BigDecimal的序列化程序嗎? – raulk