У меня есть простой маршрут, который выглядит следующим образом:Camel боб вяжущие пытается преобразовать тело биржи
<route handleFault="true" streamCache="true" id="routeA">
<from uri="cxfrs://bean://simpleCxf" />
<log message="The message body contains ${body}"/>
<to uri="direct-vm:RouteB" />
</route>
<route handleFault="true" streamCache="true" id="routeB">
<from uri="direct-vm:RouteB" />
<bean ref="requestValidator" method="validateRequest" />
<log message="The input message ${body}" />
<bean ref="dbClient" method="queryDatabase" />
</route>
CXF конфигурация также довольно проста:
<cxf:rsServer id="simpleCxf" address="/test"
loggingFeatureEnabled="true"
serviceClass="com.gogol.test.TestResource">
</cxf:rsServer>
Этот простой маршрут не удается с нижеприведенное исключение
No type converter available to convert from type: org.apache.cxf.message.MessageContentsList to the required type: org.apache.camel.Exchange with value [[email protected]]
Это история сообщений, которая предполагает, что она не работает в точке <bean ref="requestValidator" method="validateRequest" />
Message History
---------------------------------------------------------------------------------------------------------------------------------------
RouteId ProcessorId Processor Elapsed (ms)
[routeA] [routeA] [direct-vm://routeA ] [6]
[routeB] [log12 ] [log ] [2]
[routeB] [to9 ] [direct-vm:routeA ] [4]
[routeA] [bean26] [bean[ref:requestValidator method: validateRequest]] [2]
Я думаю, что проблема в том, что верблюд пытается преобразовать тело, порожденную CXF к объекту Exchange. Поскольку класс requestValidator есть метод, который имеет подпись:
public void validateRequest(Exchange exchange) thows SomeException.
Но в идеале сообщение, генерируемое CXF должно быть установлено как внутри тела Exchange. Правильно ли, если не тогда, что может быть причиной вышеупомянутого исключения?
EDIT:
Я использую CXF версии 3.0.4.redhat-621084 и CAMEL версии 2.15.1.redhat-621084
{Caused by: org.apache.camel.InvalidPayloadException: No body available of type: org.apache.camel.Exchange but has value: [[email protected]] of type: org.apache.cxf.message.MessageContentsList on: Message: [[email protected]]. Caused by: No type converter available to convert from type: org.apache.cxf.message.MessageContentsList to the required type: org.apache.camel.Exchange with value [[email protected]]. Exchange[Message: [[email protected]]]. Caused by: [org.apache.camel.NoTypeConversionAvailableException - No type converter available to convert from type: org.apache.cxf.message.MessageContentsList to the required type: org.apache.camel.Exchange with value [[email protected]]]
at org.apache.camel.impl.MessageSupport.getMandatoryBody(MessageSupport.java:101)[198:org.apache.camel.camel-core:2.15.1.redhat-621084]
at org.apache.camel.builder.ExpressionBuilder$42.evaluate(ExpressionBuilder.java:1037)[198:org.apache.camel.camel-core:2.15.1.redhat-621084]
... 68 more
Caused by: org.apache.camel.NoTypeConversionAvailableException: No type converter available to convert from type: org.apache.cxf.message.MessageContentsList to the required type: org.apache.camel.Exchange with value [[email protected]]
at org.apache.camel.impl.converter.BaseTypeConverterRegistry.mandatoryConvertTo(BaseTypeConverterRegistry.java:177)[198:org.apache.camel.camel-core:2.15.1.redhat-621084]
at org.apache.camel.core.osgi.OsgiTypeConverter.mandatoryConvertTo(OsgiTypeConverter.java:122)[203:org.apache.camel.camel-spring:2.15.1.redhat-621084]
at org.apache.camel.impl.MessageSupport.getMandatoryBody(MessageSupport.java:99)[198:org.apache.camel.camel-core:2.15.1.redhat-621084]
... 69 more}
Я попытался преобразовать способ, о котором вы упоминали, но единственная разница, которую он делает, заключается в замене MessageContentsList на TestResource в исключении. Без метода convertBodyTo excpetion говорит: Отсутствует тип преобразователя доступны не для преобразования типа ** MessageContentsList ** до требуемого типа: Обмен С методом convertBodyTo исключение говорит: Отсутствует тип преобразователя доступны не для преобразования типа * * TestResource ** до требуемого типа: Exchange. – Gogol
Хорошо, если вы попытались это сделать, похоже, что у вас могут возникнуть проблемы с верблюдом, думая, что ему нужен конвертер типов, чтобы преобразовать MessageContentsList в обмен, но так как это должно быть только телом вашего обмена, это не должно быть преобразование типов. Можете ли вы настроить контекст верблюда на TRACE и добавить отображение результата? –
Какие объекты управляют мыслями Верблюда? В соответствии со стратегией привязки бобов верблюда Exchange не следует воспринимать как любой другой класс для преобразования данных. Также, если я изменяю аргумент метода validateRequest на TestResource, то верблюд называет метод просто прекрасным. Но тогда я не получаю способ установить обменный орган. Любые мысли, пожалуйста? – Gogol