Java 使用 Camel 生成肥皂请求
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20883021/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Generate soap request using Camel
提问by Darshan Patel
I want to call third party webservice from camel using wsdl file without any generating client code(because i think if i am providing wsdl file then camel able to generate client that we previously generate and that's working in our older code)
我想使用 wsdl 文件从骆驼调用第三方 web 服务而不生成任何客户端代码(因为我认为如果我提供 wsdl 文件,那么骆驼能够生成我们以前生成的客户端,并且在我们的旧代码中工作)
After searching long time i found some code that helps me to achieve my goal
经过长时间的搜索,我找到了一些可以帮助我实现目标的代码
code is
代码是
import org.apache.camel.CamelContext;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.dataformat.soap.Soap11DataFormatAdapter;
import org.apache.camel.dataformat.soap.Soap12DataFormatAdapter;
import org.apache.camel.dataformat.soap.name.ServiceInterfaceStrategy;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.model.dataformat.SoapJaxbDataFormat;
import com.camel.model.Application;
public class TestMain {
static CamelContext context;
public static void main(String args[]) throws Exception {
CamelContext context = new DefaultCamelContext();
ProducerTemplate template = context.createProducerTemplate(0);
context.start();
String url="cxf://http://localhost:8081/buzzor-service/services/ApplicationService?" +
"wsdlURL=http://localhost:8081/buzzor-service/services/ApplicationService?wsdl&" +
"serviceName={http://service.application.buzzor.atpl.com}ApplicationService&" +
"portName={http://service.application.buzzor.atpl.com}ApplicationServiceHttpPort&" +
"dataFormat=MESSAGE";
Exchange reply = sendSimpleMessage(template, url);
org.apache.camel.Message out = reply.getOut();
String result = out.getBody(String.class);
System.out.println(result);
Thread.sleep(10000);
context.stop();
}
private static Exchange sendSimpleMessage(ProducerTemplate template,
String endpointUri) {
Exchange exchange = template.request(endpointUri, new Processor() {
public void process(final Exchange exchange) throws Exception {
exchange.getIn().setBody("<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+ "<soap:Body><ns1:getApplication xmlns:ns1=\"http://cxf.component.camel.apache.org/\">"
// + "<arg0 xmlns=\"http://cxf.component.camel.apache.org/\">hello world</arg0>"
+ "</ns1:getApplication></soap:Body></soap:Envelope>");
System.out.println(exchange.getIn().getBody());
}
});
return exchange;
}
}
this works correctly but here i am manually generate soap Envelop
这工作正常,但在这里我手动生成肥皂信封
wsdl file is
wsdl 文件是
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://service.application.buzzor.atpl.com" xmlns:ns1="urn:http://model.application.buzzor.atpl.com" xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding" xmlns:tns="http://service.application.buzzor.atpl.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<wsdl:types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://service.application.buzzor.atpl.com">
<xsd:element name="getApplication">
<xsd:complexType/>
</xsd:element>
<xsd:element name="getApplicationResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="addApplication">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="in0" nillable="true" type="ns1:Application"/>
<xsd:element maxOccurs="1" minOccurs="1" name="in1" nillable="true" type="ns1:User"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="addApplicationResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="out" nillable="true" type="ns1:ApplicationResult"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="urn:http://model.application.buzzor.atpl.com">
<xsd:complexType name="Application">
<xsd:sequence>
<xsd:element minOccurs="0" name="APP_ID" nillable="true" type="xsd:int"/>
<xsd:element minOccurs="0" name="APP_NAME" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="APP_PASSWORD" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="APP_TYPE" nillable="true" type="xsd:int"/>
<xsd:element minOccurs="0" name="APP_VERSION" nillable="true" type="xsd:int"/>
<xsd:element minOccurs="0" name="EXCEPTION_HANDLED" nillable="true" type="xsd:int"/>
<xsd:element minOccurs="0" name="IS_LOGIN_REQUIRED" nillable="true" type="xsd:int"/>
<xsd:element minOccurs="0" name="LONG_CODES" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="PREVIOUS_NODE_KEY" nillable="true" type="xsd:int"/>
<xsd:element minOccurs="0" name="REPLY_TEXT" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="WELCOME_NOTE" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="User">
<xsd:sequence>
<xsd:element minOccurs="0" name="ACTIVE_STATUS" type="xsd:int"/>
<xsd:element minOccurs="0" name="CUSTOMER_ID" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="FIRST_NAME" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="IS_ADMIN" type="xsd:int"/>
<xsd:element minOccurs="0" name="LAST_NAME" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="LOGIN_USER_ID" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="LOGIN_ALLSC" type="xsd:int"/>
<xsd:element minOccurs="0" name="USER_ACTION" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="USER_CONFIRM_PASSWORD" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="USER_ID" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="USER_PASSWORD" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="USER_PATH" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="USER_STATUS" type="xsd:int"/>
<xsd:element minOccurs="0" name="USER_TYPE" type="xsd:boolean"/>
<xsd:element minOccurs="0" name="VERSION_ID" type="xsd:double"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ApplicationResult">
<xsd:sequence>
<xsd:element minOccurs="0" name="APP_ID" nillable="true" type="xsd:int"/>
<xsd:element minOccurs="0" name="APP_NAME" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="ERROR_MESSAGE" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="ERROR_STATUS" nillable="true" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<wsdl:message name="addApplicationRequest">
<wsdl:part name="parameters" element="tns:addApplication">
</wsdl:part>
</wsdl:message>
<wsdl:message name="addApplicationResponse">
<wsdl:part name="parameters" element="tns:addApplicationResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getApplicationResponse">
<wsdl:part name="parameters" element="tns:getApplicationResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="getApplicationRequest">
<wsdl:part name="parameters" element="tns:getApplication">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="ApplicationServicePortType">
<wsdl:operation name="getApplication">
<wsdl:input name="getApplicationRequest" message="tns:getApplicationRequest">
</wsdl:input>
<wsdl:output name="getApplicationResponse" message="tns:getApplicationResponse">
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="addApplication">
<wsdl:input name="addApplicationRequest" message="tns:addApplicationRequest">
</wsdl:input>
<wsdl:output name="addApplicationResponse" message="tns:addApplicationResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ApplicationServiceHttpBinding" type="tns:ApplicationServicePortType">
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getApplication">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getApplicationRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getApplicationResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="addApplication">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="addApplicationRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="addApplicationResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ApplicationService">
<wsdl:port name="ApplicationServiceHttpPort" binding="tns:ApplicationServiceHttpBinding">
<wsdlsoap:address location="http://localhost:8081/buzzor-service/services/ApplicationService"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
now i want to generate soap request rather that static
现在我想生成肥皂请求而不是静态的
please help me
请帮我
Thanks in advance
提前致谢
采纳答案by Darshan Patel
I Changed my code as following now it works fine but i think i am not using camel properly
我改变了我的代码,现在它工作正常,但我认为我没有正确使用骆驼
so help me to improve generate soap request using camel without writing any java code.
所以帮助我使用camel改进生成soap请求,而无需编写任何java代码。
package com.camel.test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import org.apache.camel.CamelContext;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.component.cxf.DefaultCxfBinding;
import org.apache.camel.component.cxf.common.message.CxfConstants;
import org.apache.camel.impl.DefaultCamelContext;
public class CamelViralTest {
static CamelContext context;
public static void main(String args[]) throws Exception {
CamelContext context = new DefaultCamelContext();
ProducerTemplate template = context.createProducerTemplate(0);
context.start();
String url = "cxf://http://localhost:8081/buzzor-service/services/ApplicationService?"
+ "wsdlURL=http://localhost:8081/buzzor-service/services/ApplicationService?wsdl&"
+ "serviceName={http://service.application.buzzor.atpl.com}ApplicationService&"
+ "portName={http://service.application.buzzor.atpl.com}ApplicationServiceHttpPort"
+"&dataFormat=MESSAGE";
Exchange e=sendSimpleMessage1(template,url);
System.out.println(e.getOut().getBody());
Thread.sleep(10000);
context.stop();
}
private static Exchange sendSimpleMessage1(ProducerTemplate template,
String endpointUri) {
final List<String> params = new ArrayList<String>();
Map<String, Object> headers = new HashMap<String, Object>();
headers.put(CxfConstants.OPERATION_NAME, "getApplication");
headers.put("requestObject", new DefaultCxfBinding());
params.add("hello world");
Exchange exchange = template.request(endpointUri, new Processor() {
public void process(final Exchange exchange) throws Exception {
SOAPMessage soapMessage=createSOAPRequest();
exchange.getIn()
.setBody( soapMessage.getSOAPBody());
}
});
return exchange;
}
private static SOAPMessage createSOAPRequest() throws Exception {
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
SOAPPart soapPart = soapMessage.getSOAPPart();
String serverURI = "http://ws.cdyne.com/";
// SOAP Envelope
SOAPEnvelope envelope = soapPart.getEnvelope();
envelope.addNamespaceDeclaration("example", serverURI);
javax.xml.soap.SOAPBody soapBody = envelope.getBody();
SOAPElement soapBodyElem = soapBody.addChildElement("getApplication", "example");
/* SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("data", "example");
soapBodyElem1.addTextNode("[email protected]");*/
MimeHeaders headers = soapMessage.getMimeHeaders();
headers.addHeader("SOAPAction", serverURI + "getApplication");
soapMessage.saveChanges();
/* Print the request message */
System.out.print("Request SOAP Message = ");
soapMessage.writeTo(System.out);
System.out.println();
return soapMessage;
}
}
回答by James
If you were using a JAXB entity instead of a String you could use the SOAP data formatto marshal it into a SOAP envelope. From that page...
如果您使用的是 JAXB 实体而不是字符串,您可以使用SOAP 数据格式将其编组到 SOAP 信封中。从那个页面...
<route>
<from uri="direct:start"/>
<marshal>
<soapjaxb contentPath="com.example.customerservice" version="1.2" elementNameStrategyRef="myNameStrategy"/>
</marshal>
<to uri="jms:myQueue"/>
</route>
Generally it is ill advised to hand write your XML as it's very error prone and you can't make use of these handy features. You'll also find it difficult to use any of the expression languages other than XPath against the plain string.
通常,不建议手写您的 XML,因为它非常容易出错并且您无法使用这些方便的功能。您还会发现很难对纯字符串使用除 XPath 之外的任何表达式语言。
回答by Manjunath
1) Let me call your wsdl file buzzor.wsdl. Save your wsdl in your project Directory as below and then Generate classes from wsdl file using wsdl2java plugin. In your pom.xml add this.
1)让我将您的 wsdl 文件称为 buzzor.wsdl。将您的 wsdl 保存在您的项目目录中,如下所示,然后使用 wsdl2java 插件从 wsdl 文件生成类。在你的 pom.xml 添加这个。
<build>
<plugins>
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>${project.basedir}/src/main/resources/wsdl/buzzor.wsdl</wsdl>
<wsdlLocation>classpath:wsdl/buzzor.wsdl</wsdlLocation>
<extraargs>
<!--this will generate client for you-->
<extraarg>-client</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
You will see the generated classes as below..
您将看到生成的类如下..
ApplicationServicePortType_ApplicationServiceHttpPort_Client.javais a sample client, which you can use to write your custom client if you want.
ApplicationServicePortType_ApplicationServiceHttpPort_Client.java是一个示例客户端,如果需要,您可以使用它来编写自定义客户端。
in your case let us use ApplicationServicePortType.java which defines 2 methods
在您的情况下,让我们使用 ApplicationServicePortType.java 定义 2 个方法
a) public java.lang.String getApplication();
b) public http.model_application_buzzor_atpl.ApplicationResult addApplication(...);
2) in your spring context configure the Jaxws client.
2) 在你的 spring 上下文中配置 Jaxws 客户端。
<beans xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<jaxws:client id="applicationService" serviceClass="com.atpl.buzzor.application.service.ApplicationServicePortType" address="http://localhost:8081/buzzor-service/services/ApplicationService" />
3) in your Camel route you can invoke a bean...
3)在你的骆驼路线中,你可以调用一个bean......
@Inject
private SoapUtils soapUtils;
...
from("direct:some-endpoint")
.bean(soapUtils,"invokeWebserviceAndGetResponse")
4) in your SoapUtils class you can inject the applicationService bean and invoke the webservice
4) 在 SoapUtils 类中,您可以注入 applicationService bean 并调用 webservice
import com.atpl.buzzor.application.service.ApplicationServicePortType;
import http.model_application_buzzor_atpl.ApplicationResult;
import http.model_application_buzzor_atpl.Application;
import http.model_application_buzzor_atpl.User;
public class SoapUtils {
@Inject
private ApplicationServicePortType applicationService;
public void invokeWebserviceAndGetResponse(Exchange exchange) {
java.lang.String response = applicationService.getApplication();
..or..
Application application = new Application(); //or whichever way you generate this.
User user = new User(); //or which ever way u generate this.
ApplicationResult result = applicationService.addApplication(application,user);
...
}
}