apache-camel - Fuse 中 Camel 类型转换失败

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

我有一个 cxf 生产者的 Camel 路线(Camel v2.10):

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

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

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 中。

最佳答案

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

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

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

关于apache-camel - Fuse 中 Camel 类型转换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22100107/

相关文章:

java - 如何从 Camel 以事务方式轮询 Kafka?

spring - 如何使用 Camel 2.9 定义自定义 CamelBeanPostProcessor

java - Apache Felix Bundle 堆内存使用情况监控

java - OSGI DS @Reference 中的原子引用

java - Karaf 中的 XML 解析器类加载问题

java - Apache Camel 缓存配置不起作用

java - 引用配置管理工厂创建的 OSGi 服务

java - OSGI bundle 结构以及与 CQ5 中其他 bundle 的通信

java - Apache Karaf Bundle 上下文监听器

java - Apache Camel AWS S3 : credential expiration and temporary credentials