我正在尝试实现一项搜索外部数据库中的项目的服务,如果找到,则将其保存在本地数据库中。
我有以下路线:
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
答案 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());
查看上述文件了解更多详情。