我有一个带有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中。
答案 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的逻辑。