это работает на 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
, не был вызван некоторыми различиями в загрузке компонентов и (возможно) регистрации типов преобразователей.
В чем заключалось исключение? Вы пробовали свой 2-й кодовый блок на 'oracle-7-jdk',' icedtea-7-jdk'? Какую версию Camel вы используете? В каком контейнере? – raulk
Извините, поставьте обновление. – Archer