Преобразование типа верблюда не работает в Fuse

У меня есть верблюжий маршрут с производителем 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

Поэтому, когда производитель запускается, возникает следующее исключение:

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.


person Gergely Kovács    schedule 28.02.2014    source источник


Ответы (1)


После 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.

person Gergely Kovács    schedule 03.03.2014
comment
В пакете camel-jaxb есть резервный преобразователь, который может преобразовать POJO в XML. Я гость, вам может понадобиться что-то сделать (добавить требуемый пакет или определить формат данных самостоятельно), чтобы убедиться, что пакет camel-jaxb запущен до вашего пакета приложений. - person Willem Jiang; 04.03.2014
comment
Это было исключение во время выполнения, поэтому все пакеты были запущены, а преобразователи были загружены, когда я впервые запустил службу. Я думаю, что нет реальной необходимости импортировать пакеты конвертера в шапку: Camel по умолчанию разделяет реестр конвертера с бандлами, а обслуживанием реестра занимается бандла camel-core. Также я видел, что FallbackConverter был загружен, так что это больше похоже на какую-то ошибку Camel с инициализацией цепочки преобразования/реестра. - person Gergely Kovács; 04.03.2014