方式一:

配置CXF环境变量,用wsdl2java工具自动产生代码。项目结构目录如下:

其中com.yq.webservice下面的所有的java类都是wsdl2java工具自动产生的。

JaxWsProxyFactoryBean factoryBean = newJaxWsProxyFactoryBean();

factoryBean.getInInterceptors().add(newLoggingInInterceptor());

factoryBean.getOutInterceptors().add(newLoggingOutInterceptor());

factoryBean.setServiceClass(HelloWorldDao.class);

factoryBean.setAddress(":8080/WebServiceTest/webservice/helloworld?wsdl");

HelloWorldDao impl=(HelloWorldDao) factoryBean.create();

impl.sayHello("zhengmo");

其中:

http//:8080/WebServiceTest/webservice/helloworld?wsdl是服务端提供的web service的端口地址。

上面的代码就是WebServiceClient.java中main方法里面的代码。

方式二:

任然需要先用wsdl2java工具生成相应的java代码。

HelloWorldDaoService factory = new HelloWorldDaoService();

HelloWorldDao helloWorldDao = factory.getHelloWorldDaoPort();

helloWorldDao.sayHello("zhengmo");

方式三:

最后一种方式不需要使用wsdl2java工具在客户端产生代码。

JaxWsDynamicClientFactory dcf =JaxWsDynamicClientFactory.newInstance();

String wsUrl= "http//:8080/WebServiceTest/webservice/helloworld?wsdl";

Client client=dcf.createClient(wsUrl);

String method= "sayHello";//webservice的方法名

Object[] result = null;try{

result= client.invoke(method, "zhengmo");//调用webservice

} catch(Exception e) {

e.printStackTrace();

}

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

参见:

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

本例下载地址:

WSDL2Java generated Client

JAX-WS Proxy

JAX-WS Dispatch APIs

JAX-WS Client Proxy

Dynamic Client

Reflection API

Service 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代码

maven-compiler-plugin

1.5

1.5

org.apache.cxf

cxf-codegen-plugin

${cxf.version}

generate-sources

generate-sources

src/main/resources/OrderProcess.wsdl

wsdl2java

启动客户端

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;public classProxyClient {private static final QName SERVICE_NAME = new QName("http://order.demo/", "OrderProcessService");private static final QName PORT_NAME = new QName("http://order.demo/", "OrderProcessPort");private static final String WSDL_LOCATION = "http://localhost:8080/OrderProcess?wsdl";public static void main(String args[]) throwsException {

URL wsdlURL= newURL(WSDL_LOCATION);

Service service=Service.create(wsdlURL, SERVICE_NAME);

OrderProcess port= service.getPort(PORT_NAME, OrderProcess.class);

Order order= newOrder();

order.setCustomerID("C001");

order.setItemID("I001");

order.setPrice(100.00);

order.setQty(20);

String result=port.processOrder(order);

System.out.println("The order ID is " +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;public classClientProxyClient {public static void main(String args[]) throwsException {

JaxWsProxyFactoryBean factory= newJaxWsProxyFactoryBean();

factory.setServiceClass(OrderProcess.class);

factory.setAddress("http://localhost:8080/OrderProcess");

OrderProcess service=(OrderProcess)factory.create();

Order order= newOrder();

order.setCustomerID("C001");

order.setItemID("I001");

order.setPrice(100.00);

order.setQty(20);

String result=service.processOrder(order);

System.out.println("The order ID is " +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;public classOrderProcessJaxWsDynamicClient {publicOrderProcessJaxWsDynamicClient() {

}public static void main(String str[]) throwsException {

JaxWsDynamicClientFactory dcf=JaxWsDynamicClientFactory.newInstance();

Client client= dcf.createClient("http://localhost:8080/OrderProcess?wsdl");

Object order= Thread.currentThread().getContextClassLoader().loadClass("demo.order.Order").newInstance();

Method m1= order.getClass().getMethod("setCustomerID", String.class);

Method m2= order.getClass().getMethod("setItemID", String.class);

Method m3= order.getClass().getMethod("setQty", Integer.class);

Method m4= 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("Response is " + 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;public classOrderProcessJaxWsDynClient {publicOrderProcessJaxWsDynClient() {

}public static void main(String str[]) throwsException {

JaxWsDynamicClientFactory dcf=JaxWsDynamicClientFactory.newInstance();

Client client= dcf.createClient("http://localhost:8080/OrderProcess?wsdl");

Endpoint endpoint=client.getEndpoint();//Make use of CXF service model to introspect the existing WSDL

ServiceInfo serviceInfo = endpoint.getService().getServiceInfos().get(0);

QName bindingName= new QName("http://order.demo/", "OrderProcessServiceSoapBinding");

BindingInfo binding=serviceInfo.getBinding(bindingName);

QName opName= new QName("http://order.demo/", "processOrder");

BindingOperationInfo boi= binding.getOperation(opName); //Operation name is processOrder

BindingMessageInfo inputMessageInfo = null;if (!boi.isUnwrapped()) {//OrderProcess uses document literal wrapped style.

inputMessageInfo =boi.getWrappedOperation().getInput();

}else{

inputMessageInfo=boi.getUnwrappedOperation().getInput();

}

List parts =inputMessageInfo.getMessageParts();

MessagePartInfo partInfo= parts.get(0); //Input class is Order//Get the input class Order

Class> orderClass =partInfo.getTypeClass();

Object orderObject=orderClass.newInstance();//Populate the Order bean//Set customer ID, item ID, price and quantity

PropertyDescriptor custProperty = new PropertyDescriptor("customerID", orderClass);

custProperty.getWriteMethod().invoke(orderObject,"C001");

PropertyDescriptor itemProperty= new PropertyDescriptor("itemID", orderClass);

itemProperty.getWriteMethod().invoke(orderObject,"I001");

PropertyDescriptor priceProperty= new PropertyDescriptor("price", orderClass);

priceProperty.getWriteMethod().invoke(orderObject, Double.valueOf(100.00));

PropertyDescriptor qtyProperty= new PropertyDescriptor("qty", orderClass);

qtyProperty.getWriteMethod().invoke(orderObject, Integer.valueOf(20));//Invoke the processOrder() method and print the result//The response class is String

Object[] result =client.invoke(opName, orderObject);

System.out.println("The order ID is " + result[0]);

}

}

//这种方法动态获取服务端对象也可以(亲测成功,jar版本cxf3.0.3)

JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();

Client client = dcf.createClient("http://localhost:8080/cxfservice/services/getZdxmlist?wsdl");

Object[] result = client.invoke("getZdxmlist", "在建","2016","zd_ctx");

System.out.println("Echo response: " + result[0]);

JSONArray ja=JSONArray.fromObject(result[0]);

Object objs[]=ja.toArray();

for (int i = 0; i < objs.length; i++) {

System.out.println(JSONObject.fromObject(objs[i]).get("mc"));//输出各个对象的名称属性

}

有可能汇报这个错误:

解决 方法:将客户端中的Service的包名改成与服务端中的一致,问题解决。

http://bbs.csdn.net/topics/390797587

java cxf 客户端调用_CXF客户端调用N种方式相关推荐

  1. java调用restful接口_Java调用RESTful接口的几种方式

    前端一般通过Ajax来调用,后端调用的方式还是挺多的,比如HttpURLConnection,HttpClient,Spring的RestTemplate 服务端代码如下: 服务端接口请求的URL:h ...

  2. 【转】java调用http接口的几种方式总结

    java调用http接口的几种方式总结 本文参考: https://blog.csdn.net/fightingXia/article/details/71775516 https://www.cnb ...

  3. 传递function_Excel VBA解读(132): 调用Function过程的4种方式

    学习Excel技术,关注微信公众号: excelperfect 前面的几篇文章讲解了Function过程的语法以及Function过程的优势和一些细节,也穿插使用了调用Function过程的不同方式. ...

  4. Http调用第三方接口的两种方式实例《超详细!!!》***

    Http调用第三方接口的两种方式<超详细!!!>* 最近在公司做一些调用第三方接口的工作,查阅了一部分的资料和向前辈以及朋友请教,完成了第三方接口的调用,其实主要是通过第三方提供的文档,完 ...

  5. 调用第三方接口的三种方式

    调用第三方接口到三种方式 链接 Hutool 依赖 <dependency><groupId>cn.hutool</groupId><artifactId&g ...

  6. 主程序调用动态库的两种方式,动态库调用主程序的函数

    主程序调用动态库有两种方式,即隐式调用和显式调用. 隐式调用就是共享方式,程序一开始运行就调进去.在链接时候用如下的方式链接动态库:gcc -o main main.o -L./lib -ltest( ...

  7. java method 创建_java中创建对象的5种方式

    作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法. Java中有5种创建对象的方法,下面列出例子还有他们的字节码: 使用n ...

  8. java中为final变量赋值的几种方式

    java中为final变量赋值的几种方式 前言 使用final修饰变量,很多人第一时间想到的就是不可变.然后以为变量必须得在声明的时候就为其赋初始值,其实不然,本文将详细讲解java中使用final修 ...

  9. java创建线程(Thread)的5种方式

    java创建线程(Thread)的5种方式 方式一:继承于Thread类 方式二:实现Runnable接口 方式三:实现Callable接口 方式四:使用线程池 方式五:使用匿名类 方式一:继承于Th ...

  10. Java:简述对象转换为字符串的三种方式

    Java:简述对象转换为字符串的三种方式 在Java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结. 一.(String)强制类型转换 使用 ...

最新文章

  1. Hadoop之父Doug Cutting
  2. CoffeeScript 存在操作符“?” 详解
  3. [转载]HTTP PUSH技术原理,结合ASP.NET实现以及评述
  4. angularjs 中 Factory,Service,Provider 之间的区别
  5. moosefs分布式文件系统
  6. 力扣- -正则表达式匹配
  7. 合泰单片机数码管c语言,合泰单片机定时器数码管显示
  8. 1688学python学不会_还在害怕学不会Python嘛?这篇文章让你瞬间读懂Python入门!...
  9. UVALive 6257 Chemist's vows --一道题的三种解法(模拟,DFS,DP)
  10. 最近失业,不知道干什么好,随便乱写,无内容。
  11. 终端中出现While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/pod错误的修改方法...
  12. Windows下的修改Tomcat的可用内存
  13. ShaderForge安装教程
  14. 【Python】绘制PR曲线
  15. 程序员必学的职场人际关系22原则
  16. STM32串口通信代码、ASCII码、XU4串口通信,printf只会转换为无符号类型,linux下的串口通信程序
  17. 如何删除Word文档中表格最后一行多出的空白页
  18. numpy 归一化 与 标准化
  19. C语言结构体学生基本资料,用结构体定义10个学生基本信息
  20. Java编程序哥德巴赫猜想

热门文章

  1. 技术细节决定技术深度
  2. 中国移动手机定位lbs接口协议讲解及java代码实现_Lbs定位功能的实现
  3. 23种设计模式的意图和适用范围总结
  4. IVI系统中的Radio设计与实现
  5. phpinfo 没有mysql_php phpinfo中没有mysql的信息
  6. Matlab 振动加速度 对应的振动频率,由振动加速度进行频域二次积分求振动位移...
  7. 我的实践:pytorch框架下基于BERT实现文本情感分类
  8. 华钜同创:跨境运营培训如何提升亚马逊产品转化率
  9. MySQL(四)完整性约束
  10. Hibernate Annotation的 *ToOne默认的FetchType是EAGER的