有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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版


共 (4) 个答案

  1. # 1 楼答案

    因为您正在调用一个方法,camel在调用该方法之前必须将其转换为特定类型

    如果该值为空,则无法分配类型

    你能试试像这样的默认值${header.brand:ABC},${header.model:ABC}

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

  2. # 2 楼答案

    骆驼2.18.0似乎有这种不良行为

    我已将版本更新为2.18.1(没有更改任何代码),现在nullbody按预期到达下一个端点

  3. # 3 楼答案

    我猜当你的空身体需要转换成

    .to("bean:itemConverter")
    

    希望得到

    也许在itemSearcher和itemConverter之间需要一个额外的处理器来处理空正文。 至少出于调试目的,试着放一个(有处理器实现),看看主体在交换中的实际外观

    顺便说一句:我不知道为什么“bean不应该有Camel的依赖项”,只要它们是Camel端点

    补充:也许bean:itemConverter必须能够接受对象作为主体,然后决定当主体不是所需“item”类的实例时该做什么

  4. # 4 楼答案

    根据http://people.apache.org/~dkulp/camel/type-converter.html中的camel文件,这是例外行为

    你能试着编写自己的转换器来进行空检查吗?例如。 上下文getTypeConverterRegistry()。addTypeConverter(MyOrder.class,String.class,新的MyOrderTypeConverter())

    查看以上文档了解更多详细信息