Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Apache Camel中访问拆分入口集的主体_Java_Split_Hashmap_Apache Camel - Fatal编程技术网

Java 在Apache Camel中访问拆分入口集的主体

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();

我的邮件正文包含一个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();
现在尝试在处理器中检索这些条目。我得到的最接近的结果是试着投下这个。我在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