Apache Camel:bean端点返回null时出错

时间:2016-12-12 17:10:27

标签: java apache-camel

我正在尝试实现一项搜索外部数据库中的项目的服务,如果找到,则将其保存在本地数据库中。

我有以下路线:

from("direct:find-and-save")
    .to("bean:itemSearcher?method=searchFor(${header.brand}, ${header.model})")
    .to("bean:itemConverter")
    .to("bean:itemRepository?method=saveItem");

itemSearcher找到项目时效果很好。如果itemSearcher找不到该项,则会返回null。我希望消息的主体设置为null,但我得到以下异常:

org.apache.camel.NoTypeConversionAvailableException: No type converter available to convert from type: org.apache.camel.converter.stream.InputStreamCache to the required type

我在itemSearcher返回null之后立即调试了Camel的代码,并看到null有效地设置为当前交换的out-message主体,然后out-message变为 - 下次交流的消息。但无论如何,某处的身体会被InputStreamCache取代。

我的问题是:如何配置Camel以将null值保留为邮件正文?如果不可能,我该如何解决bean不应该具有Camel的依赖性(即不能将Exchange实例作为参数)。

如果我在阅读的文档中遗漏了某些内容,请指出我:

我使用Camel v 2.18.0

4 个答案:

答案 0 :(得分:0)

似乎Camel 2.18.0存在这种不当行为。

我已将版本更新为2.18.1(我没有更改任何代码),现在null正文按预期进入下一个终点。

答案 1 :(得分:-1)

因为在调用方法之前调用camel必须转换为特定类型的方法。

如果值为null,则无法分配类型。

你可以尝试默认值,如$ {header.brand:ABC},$ {header.model:ABC}

OR默认为空字符串$ {header.brand:},$ {header.model:}

答案 2 :(得分:-1)

我想当你的空体需要转换成什么

时会发生异常
.to("bean:itemConverter")

期待得到。

也许您需要在itemSearcher和itemConverter之间使用额外的处理器来处理null body。 至少出于调试目的,尝试放置一个(具有处理器实现)并查看实体在Exchange中的实际外观。

BTW:我不确定为什么“豆子不应该有Camel的依赖”,只要它们是Camel端点?

ADDED:也许bean:itemConverter必须能够接受Object作为body,然后决定当body不是所需“item”类的实例时该做什么。

答案 3 :(得分:-1)

根据http://people.apache.org/~dkulp/camel/type-converter.html

中的骆驼文件,这是例外行为

您可以尝试编写自己的转换器进行空检查吗?对于Eg。 context.getTypeConverterRegistry()。addTypeConverter(MyOrder.class,String.class,new MyOrderTypeConverter());

查看上述文件了解更多详情。