当前位置: 首页 > 知识库问答 >
问题:

Apache Camel:beanendpoint返回null时出错

宇文俊明
2023-03-14

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

我有以下路线:

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.NoTypeConversion可用性异常:没有类型转换器可用于从type:org.apache.camel.converter.stream.InputStreamCache转换为所需类型

我在itemSearcher返回null后立即调试了Camel的代码,发现null有效地被设置为当前交换的out消息主体,然后out消息成为下一次交换的in消息。但不管怎样,在某个地方,body会被InputStreamCache所取代。

我的问题是:如何配置Camel以将值保留为消息正文?如果不可能的话,我该如何给出bean不应该具有Camel的依赖项(即不能将<代码>交换 实例作为参数)。

如果我在阅读的文档中遗漏了什么,请告诉我:

  • Bean集成
  • Bean组件
  • 豆类绑定

我使用Camel v.2.18.0

共有3个答案

郝冥夜
2023-03-14

我想当你的空体需要转换为

.to("bean:itemConverter")

期望得到。

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

顺便说一句:我不确定为什么“bean不应该依赖于Camel”,只要它们是Camelendpoint?

添加:可能bean:itemConverter必须能够接受对象作为主体,然后决定当主体不是所需的“item”类的实例时要做什么。

牛枫
2023-03-14

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

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

您可以尝试这样的默认值${header.brand:ABC},${header.model:ABC}

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

马侯林
2023-03-14

看来骆驼2.18.0就有那种行为不端。

我已经将版本更新到2.18.1(没有更改任何代码),现在,body按预期到达下一个endpoint。

 类似资料:
  • 我有两个活动和两个布局。当我在第一个活动中显示列表时,一切都正常,并在单击时给出列表中项目的编号,但当我尝试在第二个活动中重复相同的内容时,它会告诉我RecycleServiceClickListener侦听器为空。 适配器: 第一项活动: 第二项活动: 错误: 我不明白为什么在第一种情况下,它正常处理单击,而在第二种情况下,它说RecyclerViewClickListener为null

  • 问题内容: 说我有一些Java代码: 还有一些代码可以加载: 能永远?为什么/为什么不呢?如果是这样,在什么情况下? 问题答案: 根据此方法javadoc: 返回该类的类加载器。一些实现可能使用null来表示引导类加载器。如果此类是由bootstrap类加载器加载的,则此方法在此类实现中将返回null。

  • 我试图测试一个简单POST Rest调用,但存在NullPointerException。 我的RestController: 我的单元测试: 由于以下错误,此测试失败:NullPointerException,确切地说,response ResponseEntity对象为Null。 verify输出将执行以下操作: 知道为什么响应是空的吗?我为测试使用了正确的注释,因此应该注入模拟。也许我在这里

  • 你能告诉我如何只对某些代码块运行事务吗?我有@Transactional的服务函数,并从它们调用存储库函数,在那里执行查询。但当查询失败时,由于事务必须结束,服务功能也随之失效。那么,当存储库函数失败时,如何返回null值呢?我需要在失败时捕获空值,并继续一些逻辑。我的代码: 我尝试了@davidxxx的答案,得到了这个错误:

  • 问题内容: 我正在使用Servlets&Struts2的混合情况下工作。 我正在调用HTTPServlet,并且正在处理数据。 然后,我需要调用struts API在DB中插入数据。 在那我也使用HTTPSession。 所以我打电话 要获取HttpRequest,然后在该struts动作类中进行会话。 Servlet正在调用Struts Action类。 但 始终返回NULL。 是因为它没有被网

  • 问题内容: 我使用osgi + cdi,并且有以下代码: 而且我有以下tasklist.fxml 但是parent.lookup(“#testComboBox”)返回null。怎么解释呢?我已经多次检查ID的名称。 问题答案: 您可以将所需的逻辑放入控制器类中,而不必使用仅在渲染场景之后才能使用的查找。您可以通过注释将元素从FXML文件注入到控制器类中。 查询通常不可靠,我建议避免使用它们。如果您