适用于oracle-7-jdk
上的icedtea-7-jdk
,Gentoo 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.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");
在保存到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
的帮助下组装并没有因组件启动和(可能)类型转换器注册的某些差异而导致。
答案 0 :(得分:1)
如果您的身体中有Map
,则应该能够将其直接传递到camel-mongodb
端点,因为该组件执行必要的类型转换以进行转换:
Map
=&gt; DBObject
(MongoDB&#39;必需类型)。String
=&gt; DBObject
。File
=&gt; DBObject
。InputStream
=&gt; DBObject
。DBObject
使用杰克逊先将其转换为Map
,然后转换为BasicDBObject
。您可以尝试跳过JSON和convertBodyTo
的编组吗?但请确保在类路径中保留camel-jackson
+依赖项。