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

骆驼豆绑定试图将身体转换为交换

赵锐
2023-03-14

我有一个简单的路线,看起来像这样:

<route handleFault="true" streamCache="true" id="routeA">
    <from uri="cxfrs://bean://simpleCxf" />
    <log message="The message body contains ${body}"/>
    <to uri="direct-vm:RouteB" />
</route>

<route handleFault="true" streamCache="true" id="routeB">
    <from uri="direct-vm:RouteB" />
    <bean ref="requestValidator" method="validateRequest" />
    <log message="The input message ${body}" />
    <bean ref="dbClient" method="queryDatabase" />
</route>

CXF 配置也非常简单:

<cxf:rsServer id="simpleCxf" address="/test"
    loggingFeatureEnabled="true"
    serviceClass="com.gogol.test.TestResource">
</cxf:rsServer>

此简单路由失败,出现以下异常

No type converter available to convert from type: org.apache.cxf.message.MessageContentsList to the required type: org.apache.camel.Exchange with value [com.gogol.test.resource.SimpleObject@773736ca]

这是消息历史记录,表明它在点失败

Message History
---------------------------------------------------------------------------------------------------------------------------------------
RouteId ProcessorId                   Processor                      Elapsed (ms)
[routeA] [routeA] [direct-vm://routeA                                ] [6]
[routeB] [log12 ] [log                                               ] [2]
[routeB] [to9   ] [direct-vm:routeA                                  ] [4]
[routeA] [bean26] [bean[ref:requestValidator method: validateRequest]] [2]

我认为问题是Camel试图将cxf生成的主体转换为Exchange对象。因为requestValidator类有一个签名为的方法

public void validateRequest(Exchange exchange) thows SomeException.

但理想情况下,cxf 生成的消息应设置为 Exchange 中的主体。我是否正确,如果不是,那么上述例外的原因可能是什么?

编辑:

我使用的是CXF 3.0.4.redhat-621084版和CAMEL 2.15.1.redhat-62084版

{Caused by: org.apache.camel.InvalidPayloadException: No body available of type: org.apache.camel.Exchange but has value: [com.gogol.schema.TestResourcec@6b651b67] of type: org.apache.cxf.message.MessageContentsList on: Message: [com.gogol.schema.TestResourcec@6b651b67]. Caused by: No type converter available to convert from type: org.apache.cxf.message.MessageContentsList to the required type: org.apache.camel.Exchange with value [com.gogol.schema.TestResourcec@6b651b67]. Exchange[Message: [com.gogol.schema.TestResourcec@6b651b67]]. Caused by: [org.apache.camel.NoTypeConversionAvailableException - No type converter available to convert from type: org.apache.cxf.message.MessageContentsList to the required type: org.apache.camel.Exchange with value [com.gogol.schema.TestResourcec@6b651b67]]
    at org.apache.camel.impl.MessageSupport.getMandatoryBody(MessageSupport.java:101)[198:org.apache.camel.camel-core:2.15.1.redhat-621084]
    at org.apache.camel.builder.ExpressionBuilder$42.evaluate(ExpressionBuilder.java:1037)[198:org.apache.camel.camel-core:2.15.1.redhat-621084]
    ... 68 more
Caused by: org.apache.camel.NoTypeConversionAvailableException: No type converter available to convert from type: org.apache.cxf.message.MessageContentsList to the required type: org.apache.camel.Exchange with value [com.gogol.schema.TestResourcec@6b651b67]
    at org.apache.camel.impl.converter.BaseTypeConverterRegistry.mandatoryConvertTo(BaseTypeConverterRegistry.java:177)[198:org.apache.camel.camel-core:2.15.1.redhat-621084]
    at org.apache.camel.core.osgi.OsgiTypeConverter.mandatoryConvertTo(OsgiTypeConverter.java:122)[203:org.apache.camel.camel-spring:2.15.1.redhat-621084]
    at org.apache.camel.impl.MessageSupport.getMandatoryBody(MessageSupport.java:99)[198:org.apache.camel.camel-core:2.15.1.redhat-621084]
        ... 69 more}

共有1个答案

贡可人
2023-03-14

我不确定camel xml dsl如何正确格式化,但是您可以明确地告诉camel进行类型转换。您可以通过使用convertBodyTo调用来强制类型转换来测试您的理论。

from("myEndpoint")
    .log("This is my previous object")
    .convertBodyTo(TestResource.class)
    .log("This is my object after a camel type conversion");
 类似资料:
  • 脚本: CSV文件被发送到我的endpoint,Pojo将java数据和消息转换为我的一条路由,比如(“direct:consume”)路由,然后处理器处理该文件,处理消息并创建新的输出 问题: 文件只包含代码中断的一行 文件包含多行代码工作 尝试: 试图找到一种方法来确定交易记录的数量。getIn()。getBody() 阅读stackoverflow 阅读有关exchange的文档 在不知道记

  • 我已经创建了一个服务代理。 代理(请求类型为)和实际服务(请求类型。)之间有一个处理器。 进入< code > process(Exchange Exchange)方法的交换体属于< code>TypeA。 我能够使用下面的代码行访问数据 现在,我想将此信息更改为。 我使用下面的代码添加主体。 我得到了 现在,我想使用调用真正的服务,它来自。 我尝试进入处理器,但出现以下异常 真正的Web服务没有

  • 我通过扩展DefaultComponent编写了一个camel组件,还实现了endpoint、consumer和producer的关联类。我的producer正在扩展camel DefaultProducer,我想在这个类中注入一个Springbean,这样每当执行一个路由时 我将能够从文件系统中获取文件并将其存储到数据库中。为了将文件存储到数据库中,我有一个由Spring容器实例化的服务类,但是

  • 我试图在Apache Camel中实现以下路径:endpoint1接收消息。路由向endpoint2(清除主体)发起请求。转换器通过使用endpoint2的结果来转换endpoint1的主体,以输入消息。 我尝试了以下几点: 问题是,该主体被消息endpoint2覆盖。我正在考虑将消息体备份到属性中。但什么是最佳实践?

  • 尝试将春豆添加到骆驼体属性中。类似于: 甚至先输入标题: 其中uiLimit为: 并且在标头和属性中仍然为空。 任何想法为什么注册表中的 bean 查找对 OSGI 不起作用?(单个捆绑包中的所有豆子/路由) PS:这在Route中运行良好:

  • 我有一条骆驼路线,如下所示。 bean方法顾名思义,分别将body设置为“Hello”和“World”。 我还设置了onException子句,如下所示: 假设,我将一条消息放在队列“开始”上,正文为“测试消息”。在第一个杜米豆中成功处理后,我在第二个杜米豆中抛出一个运行时异常。我希望看到实际的消息或(原始消息内容完好无损,即“测试消息”)被发送到我的死信队列。 但是,死信队列上的消息内容是“He