JMo*_*ore 5 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();
Run Code Online (Sandbox Code Playgroud)
现在尝试在处理器中检索这些条目。我最接近的是尝试投射这个。我发现了使用 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);
(...)
}
Run Code Online (Sandbox Code Playgroud)
解决方案
我的目标是避免与转换继承类相关的警告。simple我最终使用了关键字。这样我就可以将地图的值传递到处理器中(从而避免未经检查的强制转换警告)并通过标头访问密钥。
.from(FROM)
.aggregate(...)
.split(simple("${in.body.entrySet}"))
.setHeader(KEY_VALUE_AS_HEADER, simple("${body.getKey}"))
.setBody(simple("${body.getValue}"))
.process(new ReadMapEntry())
.to(TO)
.end()
.end();
Run Code Online (Sandbox Code Playgroud)
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);
(...)
}
Run Code Online (Sandbox Code Playgroud)
您可以尝试使用一个简单的 Bean 并直接注入正确类型的 Body。
// 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]
}
Run Code Online (Sandbox Code Playgroud)
然后你在你的路线中调用它
.method(new ReadMapEntryBean()) // if Bean contains only 1 method
Run Code Online (Sandbox Code Playgroud)
或者
.method(new ReadMapEntryBean(), "readMap") // if there are other methods
Run Code Online (Sandbox Code Playgroud)
处理器接口相当陈旧、笨拙且难以测试。POJO 更容易使用,并且与 Camel 配合得很好。
有关更多详细信息,请参阅Camel 文档中的参数绑定注释和Bean 集成