Osgi 驼峰类型转换器失败:InvalidPayloadException:没有类型的正文

Osgi 驼峰类型转换器失败:InvalidPayloadException:没有类型的正文,osgi,apache-camel,Osgi,Apache Camel,该应用程序基于OSGI。 我有一个自定义带注释的转换器: package com.domain.bundle1.web.camel.converters; import ...; @Converter public class FooTransferObjectConverter { public FooTransferObjectConverter() { } @Converter public static FooTransferObject toFoo

该应用程序基于OSGI。 我有一个自定义带注释的转换器:

package com.domain.bundle1.web.camel.converters;

import ...;

@Converter
public class FooTransferObjectConverter {
    public FooTransferObjectConverter() {
    }

    @Converter
    public static FooTransferObject toFooTransferObject(Foo foo, Exchange exchange) throws Exception {
        // some magic
        return fooTransferObject;
    }
}
我还声明了它在TypeConverter文件中出现的包:

其中包括:

com.domain.bundle1.web.camel.converters
驼峰上下文文件包含下一个代码:

<log loggingLevel="INFO" message="Converting to FooTransferObject" />
<convertBodyTo type="com.domain.bundle2.model.FooTransferObject" />
<log loggingLevel="INFO" message="Converted!" />
然后由自定义处理程序缓存异常, 然后我发现:

    Caused by: javax.xml.bind.MarshalException
 - with linked exception:
[com.sun.istack.internal.SAXException2: A cycle is detected in the object graph. This will cause infinitely deep XML: freebaseball SpeedKick  -> fr????f????tb??ll Sp????dK??ck  -> free
football SpeedKick ]
        at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:311)[:1.7.0_40]
        at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:236)[:1.7.0_40]
        at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:95)
        at org.apache.camel.converter.jaxb.FallbackTypeConverter.marshall(FallbackTypeConverter.java:238)
        at org.apache.camel.converter.jaxb.FallbackTypeConverter.convertTo(FallbackTypeConverter.java:95)
        ... 163 more
Caused by: com.sun.istack.internal.SAXException2: A cycle is detected in the object graph. This will cause infinitely deep XML: freebaseball SpeedKick  -> fr????f????tb??ll Sp????dK??c
k  -> freebaseball SpeedKick
        at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:237)[:1.7.0_40]

你认为什么是问题?如何在TypeConverterRegistry中查看加载的转换器?

我已经解决了我的问题。FallbackTypeConverter开始工作,因为camel没有加载我的自定义常规类型转换器。 我在调试模式下检查了TypeConverterRegister中的转换器映射,没有找到我的FootTransferObjectConverter

问题出在文件
TypeConverter
中。我刚刚将转换器类的名称添加到路径中,然后将其加载到注册表中

com.domain.bundle1.web.camel.converters.FooTransferObjectConverter
应用程序中的Camel版本-2.11.1。以书面形式,下一步:

在Camel 2.8中,我们改进了类型转换器加载程序以支持 指定转换器类的FQN类名。这有 避免在包中扫描@Converter类的优点。 相反,它直接加载@Converter类。这是一个高度敏感的问题 建议今后使用的方法


但是我试着跑了。文件
TypeConverter
只包含在包路径中。

你能发布更多错误的堆栈跟踪吗,因为它说明了一些奇怪的非法注释异常。我不明白,为什么camel在进程达到转换时尝试将Foo对象序列化为XML?
com.domain.bundle1.web.camel.converters.FooTransferObjectConverter