Ich habe einen einfachen Weg zu konvertieren, die wie folgt aussieht:Camel Bohne Bindung versucht, den Körper zu Exchange
<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>
die cxf Konfiguration auch ziemlich einfach:
<cxf:rsServer id="simpleCxf" address="/test"
loggingFeatureEnabled="true"
serviceClass="com.gogol.test.TestResource">
</cxf:rsServer>
Diese einfache Route nicht mit die folgende Ausnahme
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]]
Dies ist die Nachrichtenhistorie, die darauf hindeutet, dass es an dem Punktfehlschlägt
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]
ich glaube, das Problem ist, dass Kamel versucht, den Körper von cxf zu einem Exchange-Objekt erzeugt zu konvertieren. Da die requestValidator Klasse verfügt über eine Methode, die eine Signatur hat:
public void validateRequest(Exchange exchange) thows SomeException.
Aber im Idealfall die Nachricht von cxf erzeugt sollte als Körper innerhalb von Exchange festgelegt werden. Habe ich Recht, wenn nicht, was könnte der Grund für die obige Ausnahme sein?
EDIT:
Ich bin mit CXF Version 3.0.4.redhat-621084 und CAMEL Version 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}
Ich habe versucht, die Art, wie Sie erwähnt haben, zu konvertieren, aber der einzige Unterschied, den es macht, ist das Ersetzen der MessageContentsList durch TestResource in der Ausnahme. Ohne die convertBodyTo Methode der excpetion sagt: Kein Typ Konverter verfügbar von Typ konvertieren ** MessageContentsList ** auf den gewünschten Typen: Exchange Mit der convertBodyTo Methode der Ausnahme, sagt: verfügbar Keine Wandler von Typ zu konvertieren * * TestResource ** auf den erforderlichen Typ: Exchange. – Gogol
Ok, wenn du es ausprobiert hast, dann sieht es so aus, als hättest du Probleme mit dem Kamel-Denken. Es benötigt einen Typkonverter, um die MessageContentsList in einen Exchange zu konvertieren, aber da dies nur der Körper deines Exchange sein sollte, sollte es keine Konvertierung sein. Kannst du deinen Kamel-Kontext auf TRACE setzen und hinzufügen, zeige die Ausgabe an? –
Welche Objekte steuern Camels Denken? Gemäß der Kamelbohnen-Bindungsstrategie sollte der Exchange nicht als eine andere Klasse zur Datenkonvertierung betrachtet werden. Auch wenn ich das Argument der validateRequest-Methode zu TestResource ändere, ruft camel die Methode gut auf. Aber dann bekomme ich keinen Weg, den Tauschkörper zu setzen. Irgendwelche Gedanken bitte? – Gogol