Java 在Apache Camel中访问拆分入口集的主体
我的邮件正文包含一个HashMap 我按其入口集拆分此邮件:Java 在Apache Camel中访问拆分入口集的主体,java,split,hashmap,apache-camel,Java,Split,Hashmap,Apache Camel,我的邮件正文包含一个HashMap 我按其入口集拆分此邮件: .from(FROM) .aggregate(...) // create an iterable .transform(simple("${in.body.entrySet()}")) // split over the Iterable .split(body()) .process(new ReadMapEntry()) .to(TO) .end() .end();
.from(FROM)
.aggregate(...)
// create an iterable
.transform(simple("${in.body.entrySet()}"))
// split over the Iterable
.split(body())
.process(new ReadMapEntry())
.to(TO)
.end()
.end();
现在尝试在处理器中检索这些条目。我得到的最接近的结果是试着投下这个。我在ArrayList中找到了类似的例子,但我无法让它们用于此。。。在这类工作中,由于Map.Entry的泛型,它触发了未经检查的强制转换警告
public void process(final Exchange ex) throws Exception
{
Map.Entry<A, B> entry = (Map.Entry<A, B>) ex.getIn().getBody(Map.Entry.class);
(...)
}
您可以尝试使用一个简单的Bean并直接向主体注入正确的类型
// simple POJO, does not implement Processor interface
public void readMap(@Body Map.Entry<A, B> mapEntry) {
// use mapEntry (message body) directly instead of extracting it from Exchange
mapEntry.[whatever]
}
或
处理器接口非常陈旧、笨拙且难以测试。POJO更易于使用,并且与Camel配合使用效果很好
有关更多详细信息,请参阅驼峰文档和驼峰文档您是否可以包含用于尝试在地图上迭代的实际代码?如果您调试并检查map变量,它是否为null?@Tim,当在
过程(new ReadMapEntry())
中迭代整个map时,map看起来不错。这是(Map.Entry:Map.entrySet())的标准。我试图实现的更改是一次只让流程处理一个映射条目。我更新了代码以显示调用进程的位置。我再也不用手动迭代地图了。。。除非我用错了,否则我认为.transform
会创建这个条目列表,而split(body())
会将它们逐个传递给处理器。这只是您担心的编译器警告,还是路由实际上失败了?如果只是编译器警告,在我看来,有三种选择:忽略警告、注释忽略警告,或者在播放之前检查演员阵容。@Screwtape你是对的,这是警告,我只是想避免。不过我想我已经解决了我喜欢这个想法,但最终我滥用了simple
关键字,彻底修改了代码
public void process(final Exchange ex) throws Exception
{
A value = ex.getIn().getBody(A.class);
B key = ex.getIn().getHeader(KEY_VALUE_AS_HEADER, B.class);
(...)
}
// simple POJO, does not implement Processor interface
public void readMap(@Body Map.Entry<A, B> mapEntry) {
// use mapEntry (message body) directly instead of extracting it from Exchange
mapEntry.[whatever]
}
.method(new ReadMapEntryBean()) // if Bean contains only 1 method
.method(new ReadMapEntryBean(), "readMap") // if there are other methods