Java 向远程web服务发送SOAP请求,并使用apache Camel获取响应

Java 向远程web服务发送SOAP请求,并使用apache Camel获取响应,java,web-services,soap,wsdl,apache-camel,Java,Web Services,Soap,Wsdl,Apache Camel,我正在进行一项开发,向远程web服务发送SOAP请求,并使用ApacheCamel获得响应 在本例中,我使用下面提到的WSDl的cxf codegen插件成功地生成了客户端wsdl2java代码 示例WSDL URL:http://www.webservicex.net/stockquote.asmx?WSDL 在做了一些研究之后,我创建了下面的示例代码,用于向其中定义的web服务发送SOAP请求,并使用生成的客户端代码使用ApacheCamel获得响应 CamelContext conte

我正在进行一项开发,向远程web服务发送
SOAP
请求,并使用
ApacheCamel
获得响应

在本例中,我使用下面提到的WSDl的cxf codegen插件成功地生成了客户端wsdl2java代码

  • 示例WSDL URL:
    http://www.webservicex.net/stockquote.asmx?WSDL
在做了一些研究之后,我创建了下面的示例代码,用于向其中定义的web服务发送SOAP请求,并使用生成的客户端代码使用ApacheCamel获得响应

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);
但它给出了以下错误

Caused by: org.apache.camel.InvalidPayloadException: No body available of type: java.io.InputStream but has value: net.webservicex.GetQuote@10bdf5e5 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 net.webservicex.GetQuote@10bdf5e5. 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 net.webservicex.GetQuote@10bdf5e5]

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 net.webservicex.GetQuote@10bdf5e5
我错过了什么?数据绑定?还是别的什么?我使用cxf生成了客户端代码,因此如何使用cxf发送此代码?

我只想向远程web服务发送SOAP请求,并使用apache Camel获得响应。

  • 骆驼版本:2.9.0
  • Java版本:1.7.x/1.8.x

为此,最好使用CXF组件。根据CXF代码的生成方式,您可能只发送和接收字符串,而不是示例中的对象-有关更多信息,请参阅

下面是您使用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);

为此,最好使用CXF组件。根据CXF代码的生成方式,您可能只发送和接收字符串,而不是示例中的对象-有关更多信息,请参阅

下面是您使用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);

非常感谢你的支持!这样做很好。我有一个问题。如果需要多个参数,如何发送请求正文。例如:如何发送请求参数(messageHeader、securityHeader、sessionCreateRQ)进行类似下面的调用(SessionCreateRS SessionCreateRS=sessionCreatePortType.sessionCreateRQ(messageHeader、securityHeader、sessionCreateRQ);//这来自JAX-WS)哦,我有一个愚蠢的答案。。我只是简单地将它们添加到一个列表中并发送。成功了!请分享更好的答案。非常感谢!这样做很好。我有一个问题。如果需要多个参数,如何发送请求正文。例如:如何发送请求参数(messageHeader、securityHeader、sessionCreateRQ)进行类似下面的调用(SessionCreateRS SessionCreateRS=sessionCreatePortType.sessionCreateRQ(messageHeader、securityHeader、sessionCreateRQ);//这来自JAX-WS)哦,我有一个愚蠢的答案。。我只是简单地将它们添加到一个列表中并发送。成功了!请分享更好的答案。