开发CXF JAVA客户端

CXF提供了很多client端的调用方法。这里让你快速了解这些选择,帮助你判断使用哪种。

参见:

http://cxf.apache.org/docs/how-do-i-develop-a-client.html

源代码主体使用PacktPub.Apache.CXF.Web.Service.Development.Dec.2009书中的代码。本例中,将5种调用方式集中在一个工程中,并使用Maven重组的调用方式。

本例下载地址:

http://dl.iteye.com/topics/download/c647dae6-de86-3eec-9590-7fcf83e9def4

WSDL2Java generated ClientJAX-WS ProxyJAX-WS Dispatch APIsJAX-WS Client ProxyDynamic ClientReflection APIService Model API

在这里Dispatch本节内容不做介绍。

WSDL2Java generated Client

也就是依据wsdl文件生成java客户端,直接调用。查看调用方式,也就是OrderProcessService的getOrderProcessPort方法,获得服务的引用。

启动服务端

mvn test –Pserver

在启动服务端时,通过maven-compiler-plugin编译class,通过cxf-codegen-plugin依据src/main/resources/OrderProcess.wsdl生成存根类OrderProcessService

Xml代码

    <plugins><plugin><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.5</source><target>1.5</target></configuration></plugin><plugin><groupId>org.apache.cxf</groupId><artifactId>cxf-codegen-plugin</artifactId><version>${cxf.version}</version><executions><execution><id>generate-sources</id><phase>generate-sources</phase><configuration><wsdlOptions><wsdlOption><wsdl>src/main/resources/OrderProcess.wsdl</wsdl></wsdlOption></wsdlOptions></configuration><goals><goal>wsdl2java</goal></goals></execution></executions></plugin></plugins>

启动客户端

mvn test -PStubClient

JAX-WS Proxy

和生成存根类的方式相反,proxy是不需要执行wsdl2java的。但是在编译环境中需要接口类和VO类。这里,通过指定WSDL_LOCATION和PORT_NAME,使用Service.create创建service,使用service.getPort获得服务引用。

Java代码

    packagedemo.order.client;importjava.net.URL;importjavax.xml.namespace.QName;importjavax.xml.ws.Service;importdemo.order.Order;importdemo.order.OrderProcess;publicclassProxyClient{privatestaticfinalQNameSERVICE_NAME=newQName("http://order.demo/","OrderProcessService");privatestaticfinalQNamePORT_NAME=newQName("http://order.demo/","OrderProcessPort");privatestaticfinalStringWSDL_LOCATION="http://localhost:8080/OrderProcess?wsdl";publicstaticvoidmain(Stringargs[])throwsException{URLwsdlURL=newURL(WSDL_LOCATION);Serviceservice=Service.create(wsdlURL,SERVICE_NAME);OrderProcessport=service.getPort(PORT_NAME,OrderProcess.class);Orderorder=newOrder();order.setCustomerID("C001");order.setItemID("I001");order.setPrice(100.00);order.setQty(20);Stringresult=port.processOrder(order);System.out.println("TheorderIDis"+result);}}

启动服务端

mvn test –Pserver

启动客户端

mvn test -PProxyClient

Client Proxy

使用JaxWsProxyFactoryBean 类简化Proxy。

Java代码

    packagedemo.order.client;importdemo.order.Order;importdemo.order.OrderProcess;importorg.apache.cxf.jaxws.JaxWsProxyFactoryBean;publicclassClientProxyClient{publicstaticvoidmain(Stringargs[])throwsException{JaxWsProxyFactoryBeanfactory=newJaxWsProxyFactoryBean();factory.setServiceClass(OrderProcess.class);factory.setAddress("http://localhost:8080/OrderProcess");OrderProcessservice=(OrderProcess)factory.create();Orderorder=newOrder();order.setCustomerID("C001");order.setItemID("I001");order.setPrice(100.00);order.setQty(20);Stringresult=service.processOrder(order);System.out.println("TheorderIDis"+result);}}

启动服务端

mvn test –Pserver

启动客户端

mvn test -PClientProxyClient

Dynamic Client

甚至不需要SEI接口类,

Reflection API

JaxWsDynamicClientFactory.newInstance获得JaxWsDynamicClientFactory实例。通过dcf.createClient获得Client客户端引用。

Java代码

    packagedemo.order.client;importorg.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;importorg.apache.cxf.endpoint.Client;importjava.lang.reflect.Method;publicclassOrderProcessJaxWsDynamicClient{publicOrderProcessJaxWsDynamicClient(){}publicstaticvoidmain(Stringstr[])throwsException{JaxWsDynamicClientFactorydcf=JaxWsDynamicClientFactory.newInstance();Clientclient=dcf.createClient("http://localhost:8080/OrderProcess?wsdl");Objectorder=Thread.currentThread().getContextClassLoader().loadClass("demo.order.Order").newInstance();Methodm1=order.getClass().getMethod("setCustomerID",String.class);Methodm2=order.getClass().getMethod("setItemID",String.class);Methodm3=order.getClass().getMethod("setQty",Integer.class);Methodm4=order.getClass().getMethod("setPrice",Double.class);m1.invoke(order,"C001");m2.invoke(order,"I001");m3.invoke(order,100);m4.invoke(order,200.00);Object[]response=client.invoke("processOrder",order);System.out.println("Responseis"+response[0]);}}

启动服务端

mvn test –Pserver

启动客户端

mvn test -POrderProcessJaxWsDynamicClient

Service Model API

最后,Service Model是CXF内置的获取Service的信息。

Java代码

    packagedemo.order.client;importjava.beans.PropertyDescriptor;importjava.util.List;importjavax.xml.namespace.QName;importorg.apache.cxf.endpoint.Client;importorg.apache.cxf.endpoint.Endpoint;importorg.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;importorg.apache.cxf.service.model.BindingInfo;importorg.apache.cxf.service.model.BindingMessageInfo;importorg.apache.cxf.service.model.BindingOperationInfo;importorg.apache.cxf.service.model.MessagePartInfo;importorg.apache.cxf.service.model.ServiceInfo;publicclassOrderProcessJaxWsDynClient{publicOrderProcessJaxWsDynClient(){}publicstaticvoidmain(Stringstr[])throwsException{JaxWsDynamicClientFactorydcf=JaxWsDynamicClientFactory.newInstance();Clientclient=dcf.createClient("http://localhost:8080/OrderProcess?wsdl");Endpointendpoint=client.getEndpoint();//MakeuseofCXFservicemodeltointrospecttheexistingWSDLServiceInfoserviceInfo=endpoint.getService().getServiceInfos().get(0);QNamebindingName=newQName("http://order.demo/","OrderProcessServiceSoapBinding");BindingInfobinding=serviceInfo.getBinding(bindingName);QNameopName=newQName("http://order.demo/","processOrder");BindingOperationInfoboi=binding.getOperation(opName);//OperationnameisprocessOrderBindingMessageInfoinputMessageInfo=null;if(!boi.isUnwrapped()){//OrderProcessusesdocumentliteralwrappedstyle.inputMessageInfo=boi.getWrappedOperation().getInput();}else{inputMessageInfo=boi.getUnwrappedOperation().getInput();}List<MessagePartInfo>parts=inputMessageInfo.getMessageParts();MessagePartInfopartInfo=parts.get(0);//InputclassisOrder//GettheinputclassOrderClass<?>orderClass=partInfo.getTypeClass();ObjectorderObject=orderClass.newInstance();//PopulatetheOrderbean//SetcustomerID,itemID,priceandquantityPropertyDescriptorcustProperty=newPropertyDescriptor("customerID",orderClass);custProperty.getWriteMethod().invoke(orderObject,"C001");PropertyDescriptoritemProperty=newPropertyDescriptor("itemID",orderClass);itemProperty.getWriteMethod().invoke(orderObject,"I001");PropertyDescriptorpriceProperty=newPropertyDescriptor("price",orderClass);priceProperty.getWriteMethod().invoke(orderObject,Double.valueOf(100.00));PropertyDescriptorqtyProperty=newPropertyDescriptor("qty",orderClass);qtyProperty.getWriteMethod().invoke(orderObject,Integer.valueOf(20));//InvoketheprocessOrder()methodandprinttheresult//TheresponseclassisStringObject[]result=client.invoke(opName,orderObject);System.out.println("TheorderIDis"+result[0]);}}

启动服务端

mvn test –Pserver

启动客户端

mvn test -POrderProcessJaxWsDynClient

失败是成功的亲娘,没有失败哪来的成功呢?诺贝尔如果不经历千万次的失败,

开发CXF JAVA客户端

相关文章:

你感兴趣的文章:

标签云: