Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Gergely KovácsОтветов: 1

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

apache-camelapache-karafosgiapache-servicemix

Ответы

Ответ 1 · рейтинг 2 · Gergely Kovács

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы