Apache camel Camel类型转换在Fuse中失败

Apache camel Camel类型转换在Fuse中失败,apache-camel,osgi,apache-karaf,apache-servicemix,Apache Camel,Osgi,Apache Karaf,Apache Servicemix,我有一个cxf生产商的骆驼路线(骆驼v2.10): 因此,当触发生产者时,会发生以下异常: 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包

我有一个cxf生产商的骆驼路线(骆驼v2.10):

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

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中

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

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


原因:我的假设是可以将任何POJO发送到Camel CXF端点,并且它将能够处理转换。我能想到的唯一一件事是,Camel以什么顺序加载转换器很重要。当它在fuse中工作时,每秒都可以进行POJO->String->CxfPayload转换,以便可以传递地解析转换。我决定不依赖这种可传递的转换逻辑,并检查了所有加载的转换器。我发现在XML节点/元素->CxfPayload类之间的注册表中注册了某些直接转换器。所以我决定用编组POJO来欺骗Camel的逻辑。

Camel jaxb bundle有一个回退转换器,可以将POJO转换为XML。I guest您可能需要做一些事情(添加require bundle或自己定义数据格式)以确保在应用程序bundle之前启动camel jaxb bundle。这是一个运行时异常,因此在我第一次触发服务时,所有bundle都已启动,转换器也已加载。我认为不需要在头文件中导入转换器包:默认情况下,Camel与bundle共享转换器注册表,注册表的维护由Camel核心bundle处理。我还看到FallbackConverter已加载,因此它更像是转换链/注册表init中的一些Camel错误。
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
    <marshal ref="myDataFormat"/>
    <to uri="cxf:bean:myCxfEndpoint?dataFormat=PAYLOAD"/>