我有一个 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/