保险丝中的Camel类型转换失败

时间:2014-02-28 16:08:00

标签: apache-camel osgi apache-karaf apache-servicemix

我有一个带有cxf制作人的骆驼路线(Camel v2.10):

<to uri="cxf:bean:myCxfEndpoint?dataFormat=PAYLOAD"/>

我知道camel会转换为 CxfPayload ,因此我将以下导入添加到OSGi标头中:

org.apache.camel.component.cxf,
org.apache.camel.component.cxf.converter,
org.apache.camel.converter.jaxb

因此,当触发生产者时,会发生以下异常:

org.apache.camel.NoTypeConversionAvailableException - No type converter available to convert from type: my.package.Foo to the required type: org.apache.camel.component.cxf.CxfPayload

我可以通过重新启动camel-jaxb捆绑包来摆脱这个异常,但是摆脱它是不够的:我需要阻止它,因为每次重启Fuse时都会发生这种情况。

非常感谢任何想法:)

修改

事实证明,问题并不总是出现。有时它在重启后有效,有时却没有。我尝试使用捆绑级别,但仍然无法预测。我有一种感觉,可能是Camel没有正确加载转换器,但基于跟踪日志,看起来CxfPayloadConverter总是加载到ConverterRegistry中。

1 个答案:

答案 0 :(得分:2)

经过10个小时的跟踪和调试后,我找到了解决方案:我在CXF Producer之前添加了一个手动编组,如下所示:

    <marshal ref="myDataFormat"/>
    <to uri="cxf:bean:myCxfEndpoint?dataFormat=PAYLOAD"/>

为什么:我的假设是可以将任何POJO发送到Camel CXF端点,并且它将能够处理转换。我唯一能想到的是Camel加载转换器的顺序很重要。每当它在保险丝中工作时,它可以产生 POJO - &gt;字符串 - &gt; CxfPayload 转换,因此它可以传递解决转换。我决定不依赖这个传递转换逻辑并检查所有加载的转换器。我发现在XML Node / Element - &gt;之间的注册表中注册了某些直接转换器。 CxfPayload 类。所以我决定通过编组我的POJO来欺骗Camel的逻辑。