java cxf 客户端调用_CXF客户端调用N种方式
方式一:
配置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种方式相关推荐
- java调用restful接口_Java调用RESTful接口的几种方式
前端一般通过Ajax来调用,后端调用的方式还是挺多的,比如HttpURLConnection,HttpClient,Spring的RestTemplate 服务端代码如下: 服务端接口请求的URL:h ...
- 【转】java调用http接口的几种方式总结
java调用http接口的几种方式总结 本文参考: https://blog.csdn.net/fightingXia/article/details/71775516 https://www.cnb ...
- 传递function_Excel VBA解读(132): 调用Function过程的4种方式
学习Excel技术,关注微信公众号: excelperfect 前面的几篇文章讲解了Function过程的语法以及Function过程的优势和一些细节,也穿插使用了调用Function过程的不同方式. ...
- Http调用第三方接口的两种方式实例《超详细!!!》***
Http调用第三方接口的两种方式<超详细!!!>* 最近在公司做一些调用第三方接口的工作,查阅了一部分的资料和向前辈以及朋友请教,完成了第三方接口的调用,其实主要是通过第三方提供的文档,完 ...
- 调用第三方接口的三种方式
调用第三方接口到三种方式 链接 Hutool 依赖 <dependency><groupId>cn.hutool</groupId><artifactId&g ...
- 主程序调用动态库的两种方式,动态库调用主程序的函数
主程序调用动态库有两种方式,即隐式调用和显式调用. 隐式调用就是共享方式,程序一开始运行就调进去.在链接时候用如下的方式链接动态库:gcc -o main main.o -L./lib -ltest( ...
- java method 创建_java中创建对象的5种方式
作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法. Java中有5种创建对象的方法,下面列出例子还有他们的字节码: 使用n ...
- java中为final变量赋值的几种方式
java中为final变量赋值的几种方式 前言 使用final修饰变量,很多人第一时间想到的就是不可变.然后以为变量必须得在声明的时候就为其赋初始值,其实不然,本文将详细讲解java中使用final修 ...
- java创建线程(Thread)的5种方式
java创建线程(Thread)的5种方式 方式一:继承于Thread类 方式二:实现Runnable接口 方式三:实现Callable接口 方式四:使用线程池 方式五:使用匿名类 方式一:继承于Th ...
- Java:简述对象转换为字符串的三种方式
Java:简述对象转换为字符串的三种方式 在Java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结. 一.(String)强制类型转换 使用 ...
最新文章
- Hadoop之父Doug Cutting
- CoffeeScript 存在操作符“?” 详解
- [转载]HTTP PUSH技术原理,结合ASP.NET实现以及评述
- angularjs 中 Factory,Service,Provider 之间的区别
- moosefs分布式文件系统
- 力扣- -正则表达式匹配
- 合泰单片机数码管c语言,合泰单片机定时器数码管显示
- 1688学python学不会_还在害怕学不会Python嘛?这篇文章让你瞬间读懂Python入门!...
- UVALive 6257 Chemist's vows --一道题的三种解法(模拟,DFS,DP)
- 最近失业,不知道干什么好,随便乱写,无内容。
- 终端中出现While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/pod错误的修改方法...
- Windows下的修改Tomcat的可用内存
- ShaderForge安装教程
- 【Python】绘制PR曲线
- 程序员必学的职场人际关系22原则
- STM32串口通信代码、ASCII码、XU4串口通信,printf只会转换为无符号类型,linux下的串口通信程序
- 如何删除Word文档中表格最后一行多出的空白页
- numpy 归一化 与 标准化
- C语言结构体学生基本资料,用结构体定义10个学生基本信息
- Java编程序哥德巴赫猜想
热门文章
- 技术细节决定技术深度
- 中国移动手机定位lbs接口协议讲解及java代码实现_Lbs定位功能的实现
- 23种设计模式的意图和适用范围总结
- IVI系统中的Radio设计与实现
- phpinfo 没有mysql_php phpinfo中没有mysql的信息
- Matlab 振动加速度 对应的振动频率,由振动加速度进行频域二次积分求振动位移...
- 我的实践:pytorch框架下基于BERT实现文本情感分类
- 华钜同创:跨境运营培训如何提升亚马逊产品转化率
- MySQL(四)完整性约束
- Hibernate Annotation的 *ToOne默认的FetchType是EAGER的