2016-07-29 21 views
0

Ich mache eine Entwicklung, um eine SOAP Anfrage an einen Remote-Web-Service senden und erhalten eine Antwort mit apache Camel.Senden Sie eine SOAP-Anfrage an einen Remote-Web-Service und erhalten Sie eine Antwort mit Apache Camel

In diesem Fall habe ich erfolgreich Client Side wsdl2java Code mit der cxf-codegen-plugin für die unten genannten WSDl generiert.

  • Beispiel WSDL URL: http://www.webservicex.net/stockquote.asmx?WSDL

und nach einigen Recherchen zu tun, habe ich unter Beispielcode eine SOAP-Anforderung an den Webdienst dort definiert zu senden und eine Antwort mit Apache Camel mit der erzeugte erhalten Client-Code.

CamelContext context = new DefaultCamelContext(); 

HttpComponent httpComponent = new HttpComponent(); 
context.addComponent("http", httpComponent); 

ProducerTemplate template = context.createProducerTemplate(); 

GetQuote getQuote = new GetQuote(); 
getQuote.setSymbol("test123"); 

GetQuoteResponse getQuoteResponse = template.requestBody("http://www.webservicex.net/stockquote.asmx",getQuote, GetQuoteResponse.class); 

System.out.println(getQuoteResponse); 

Aber es gibt unter Fehler.

Caused by: org.apache.camel.InvalidPayloadException: No body available of type: java.io.InputStream but has value: [email protected] of type: net.webservicex.GetQuote on: Message[ID-namal-PC-33172-1469806939935-0-1]. Caused by: No type converter available to convert from type: net.webservicex.GetQuote to the required type: java.io.InputStream with value [email protected] Exchange[ID-namal-PC-33172-1469806939935-0-2]. Caused by: [org.apache.camel.NoTypeConversionAvailableException - No type converter available to convert from type: net.webservicex.GetQuote to the required type: java.io.InputStream with value [email protected]] 

Caused by: org.apache.camel.NoTypeConversionAvailableException: No type converter available to convert from type: net.webservicex.GetQuote to the required type: java.io.InputStream with value [email protected] 

Was habe ich verpasst hier? Datenbindung oder irgendetwas anderes? Ich habe den client-code mit cxf generiert, also wie kann ich das mit cxf senden?

Was ich einfach möchte, ist eine SOAP-Anfrage an einen Remote-Web-Service zu senden und eine Antwort mit Apache Camel erhalten.

  • Kamel Version: 2.9.0
  • Java Version: 1.7.x/1.8.x

Antwort

2

Es wäre besser, die CXF Komponente für diesen Einsatz. Abhängig davon, wie der CXF-Code generiert wird, können Sie einfach & eine Zeichenfolge anstelle eines Objekts in Ihrem Beispiel erhalten - siehe How to tell cxf to keep the wrapper types in methods? für weitere Informationen.

Hier ist Ihr Beispiel mit CXF.

CamelContext context = new DefaultCamelContext(); 

CxfComponent cxfComponent = new CxfComponent(context); 
CxfEndpoint serviceEndpoint = 
    new CxfEndpoint("http://www.webservicex.net/stockquote.asmx", cxfComponent); 

// Service class generated by CXF codegen plugin. 
serviceEndpoint.setServiceClass(StockQuoteSoap.class); 

ProducerTemplate template = context.createProducerTemplate(); 

// Request and response can be 'bare' or 'wrapped', see the service class. 
String getQuoteResponse = template.requestBody(serviceEndpoint, "MSFT", String.class); 

System.out.println(getQuoteResponse); 
+0

Vielen Dank bgossit! Es funktioniert gut dafür. Ich habe eine Frage. So senden Sie den Anfragetext, wenn mehrere Parameter benötigt werden. zB: Wie man Request-Parameter (messageHeader, securityHeader, sessionCreateRQ) für einen ähnlichen Aufruf sendet (SessionCreateRS sessionCreateRS = sessionCreatePortType.sessionCreateRQ;) Dies ist von JAX-WS) – namalfernandolk

+0

Oh ich hatte eine dumme Antwort .. Ich habe sie einfach zu einer Liste hinzugefügt und gesendet. Es funktionierte! Bitte teilen Sie eine bessere Antwort. – namalfernandolk