【问题标题】:Camel type conversion fails in FuseFuse 中的骆驼类型转换失败
【发布时间】:2014-04-01 17:55:54
【问题描述】:

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

所以当producer被触发时,会发生如下异常:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • camel-jaxb 包有一个备用转换器,可以将 POJO 转换为 XML。我来宾您可能需要做一些事情(添加 require 包或自己定义数据格式)以确保在您的应用程序包之前启动 camel-jaxb 包。
    • 这是一个运行时异常,所以当我第一次触发该服务时,所有捆绑包都已启动并且转换器已加载。我认为没有真正需要在标头中导入转换器包:Camel 默认情况下与捆绑包共享转换器注册表,并且注册表的维护由骆驼核心捆绑包处理。我还看到 FallbackConverter 已加载,所以它更像是转换链/注册表初始化的一些 Camel 错误。
    猜你喜欢
    • 2019-02-22
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多