2016-04-19 2 views
0

У меня есть простой маршрут, который выглядит следующим образом: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} 

ответ

0

Я не уверен на верблюдах XML DSL хау для правильного форматирования, но вы всегда можете прямо указывать верблюду на преобразование типа. Вы можете проверить свою теорию, используя вызов convertBodyTo для принудительного преобразования типа.

from("myEndpoint") 
    .log("This is my previous object") 
    .convertBodyTo(TestResource.class) 
    .log("This is my object after a camel type conversion"); 
+0

Я попытался преобразовать способ, о котором вы упоминали, но единственная разница, которую он делает, заключается в замене MessageContentsList на TestResource в исключении. Без метода convertBodyTo excpetion говорит: Отсутствует тип преобразователя доступны не для преобразования типа ** MessageContentsList ** до требуемого типа: Обмен С методом convertBodyTo исключение говорит: Отсутствует тип преобразователя доступны не для преобразования типа * * TestResource ** до требуемого типа: Exchange. – Gogol

+0

Хорошо, если вы попытались это сделать, похоже, что у вас могут возникнуть проблемы с верблюдом, думая, что ему нужен конвертер типов, чтобы преобразовать MessageContentsList в обмен, но так как это должно быть только телом вашего обмена, это не должно быть преобразование типов. Можете ли вы настроить контекст верблюда на TRACE и добавить отображение результата? –

+0

Какие объекты управляют мыслями Верблюда? В соответствии со стратегией привязки бобов верблюда Exchange не следует воспринимать как любой другой класс для преобразования данных. Также, если я изменяю аргумент метода validateRequest на TestResource, то верблюд называет метод просто прекрасным. Но тогда я не получаю способ установить обменный орган. Любые мысли, пожалуйста? – Gogol

Смежные вопросы