java Apache Camel:bean端点返回null时出错
我正在尝试实现一个服务,该服务在外部数据库中搜索项目,如果找到,则将其保存在本地数据库中
我有以下路线:
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消息体,然后out消息成为下一次交换的in消息。但在某个地方,身体被替换成了InputStreamCache
我的问题是:如何将Camel配置为将null
值保留为消息体?如果这是不可能的,我如何给出bean不应该具有Camel的依赖项(即不能将Exchange
实例作为参数)
如果我在阅读的文档中遗漏了某些内容,请指出:
我使用骆驼2.18.0版
# 1 楼答案
因为您正在调用一个方法,camel在调用该方法之前必须将其转换为特定类型
如果该值为空,则无法分配类型
你能试试像这样的默认值${header.brand:ABC},${header.model:ABC}
或者默认为空字符串${header.brand:},${header.model:}
# 2 楼答案
骆驼2.18.0似乎有这种不良行为
我已将版本更新为2.18.1(没有更改任何代码),现在
null
body按预期到达下一个端点# 3 楼答案
我猜当你的空身体需要转换成
希望得到
也许在itemSearcher和itemConverter之间需要一个额外的处理器来处理空正文。 至少出于调试目的,试着放一个(有处理器实现),看看主体在交换中的实际外观
顺便说一句:我不知道为什么“bean不应该有Camel的依赖项”,只要它们是Camel端点
补充:也许bean:itemConverter必须能够接受对象作为主体,然后决定当主体不是所需“item”类的实例时该做什么
# 4 楼答案
根据http://people.apache.org/~dkulp/camel/type-converter.html中的camel文件,这是例外行为
你能试着编写自己的转换器来进行空检查吗?例如。 上下文getTypeConverterRegistry()。addTypeConverter(MyOrder.class,String.class,新的MyOrderTypeConverter())
查看以上文档了解更多详细信息