2016-01-14 2 views
0

это работает на oracle-7-jdk, icedtea-7-jdk на Gentoo linux kernel: 4.3.3-gentoo:Camel: странное поведение 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.4 под openjdk-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"); 

Рассмотрите, что я добавил .bean(org.bson.Document.class,"parse(${body})") прямо перед сохранением в Mongo.

В чем причина?

ОБНОВЛЕНИЕ 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 

UPDATE 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 для java.math.BigDecimal;

UPDATE 3

Там не было никакой разницы между несколькими среды. Я предполагаю, что mvn exec:java работал, но uberjar, собранный с помощью maven-shade-plugin, не был вызван некоторыми различиями в загрузке компонентов и (возможно) регистрации типов преобразователей.

+0

В чем заключалось исключение? Вы пробовали свой 2-й кодовый блок на 'oracle-7-jdk',' icedtea-7-jdk'? Какую версию Camel вы используете? В каком контейнере? – 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 не имеет преобразователя типов. Улучшено abit, теперь будет 'UPD2'. Спасибо. – Archer

+0

Прохладный! Вы имеете в виду, что у Jackson нет сериализатора для BigDecimal? – raulk

Смежные вопросы