/**
*
* @param wsdlUrl wsdl的地址:http://localhost:8001/demo/HelloServiceDemoUrl?wsdl
* @param methodName 调用的方法名称 selectOrderInfo
* @param targetNamespace 命名空间 http://service.limp.com/
* @param name name HelloServiceDemo
* @param paramList 参数集合
* @throws Exception
*/
public static String dynamicCallWebServiceByCXF(String wsdlUrl,String methodName,String targetNamespace,String name,List<Object> paramList)throws Exception{
//临时增加缓存,增加创建速度
if(!factoryMap.containsKey(methodName)){
// 创建动态客户端
JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
// 创建客户端连接
Client client = factory.createClient(wsdlUrl);
ClientImpl clientImpl = (ClientImpl) client;
Endpoint endpoint = clientImpl.getEndpoint();
factoryMap.put(methodName,endpoint);
clientMap.put(methodName,client);
System.out.println("初始化");
}
//从缓存中换取 endpoint、client
Endpoint endpoint=factoryMap.get(methodName);
Client client=clientMap.get(methodName);
// Make use of CXF service model to introspect the existing WSDL
ServiceInfo serviceInfo = endpoint.getService().getServiceInfos().get(0);
// 创建QName来指定NameSpace和要调用的service
String localPart=name+"SoapBinding";
QName bindingName = new QName(targetNamespace, localPart);
BindingInfo binding = serviceInfo.getBinding(bindingName);

//创建QName来指定NameSpace和要调用的方法绑定方法
QName opName = new QName(targetNamespace, methodName);//selectOrderInfo

BindingOperationInfo boi = binding.getOperation(opName);
// BindingMessageInfo inputMessageInfo = boi.getInput();
BindingMessageInfo inputMessageInfo = null;
if (!boi.isUnwrapped()) {
//OrderProcess uses document literal wrapped style.
inputMessageInfo = boi.getWrappedOperation().getInput();
} else {
inputMessageInfo = boi.getUnwrappedOperation().getInput();
}

List<MessagePartInfo> parts = inputMessageInfo.getMessageParts();

/***********************以下是初始化参数,组装参数;处理返回结果的过程******************************************/
Object[] parameters = new Object[parts.size()];
for(int m=0;m<parts.size();m++){
MessagePartInfo part=parts.get(m);
// 取得对象实例
Class<?> partClass = part.getTypeClass();//OrderInfo.class;
System.out.println(partClass.getCanonicalName()); // GetAgentDetails
//实例化对象
Object initDomain=null;
//普通参数的形参,不需要fastJson转换直接赋值即可
if("java.lang.String".equalsIgnoreCase(partClass.getCanonicalName())
||"int".equalsIgnoreCase(partClass.getCanonicalName())){
initDomain=paramList.get(m).toString();
}
//如果是数组
else if(partClass.getCanonicalName().indexOf("[]")>-1){
//转换数组
initDomain=JSON.parseArray(paramList.get(m).toString(),partClass.getComponentType());
}else{
initDomain=JSON.parseObject(paramList.get(m).toString(),partClass);
}
parameters[m]=initDomain;

}
//定义返回结果集
Object[] result=null;
//普通参数情况 || 对象参数情况 1个参数 ||ArryList集合
try {
result = client.invoke(opName,parameters);
}catch (Exception ex){
ex.printStackTrace();
return "参数异常"+ex.getMessage();
}
//返回调用结果
if(result.length>0){
return JSON.toJSON(result[0]).toString();
}
return "invoke success, but is void ";
}

改进分析:

1.调用参数初始化和返回结果初始化 利用fastjson快速实体化

2.借用缓存可以完成快速创建的效果(日后可以redis存放缓存结果,不知道有木有坑,可以共同讨论哈)

3.完全支持List集合、JavaBean、 多个(多个多个)参数.

public static void main(String[] args) throws Exception{

/*********************参数初始化过程************************************/
String str="[{\"id\":\"NO.1\",\"money\":23},{\"id\":\"NO.2\",\"money\":24}]";
Object initDomain=JSON.parseArray(str,OrderInfo.class);

// pojoInvokes1();
List<Object> listParam=new ArrayList<>();
String params="{\"id\":\"zhangsan\",\"money\":23}";
listParam.add(params);

//////
List<Object> listParam2=new ArrayList<>();
String obj0="超级管理员";
String obj1="{\"id\":\"zhangsan\",\"money\":23}";
String obj2="{\"name\":\"one test\",\"intro\":\"这是订单详情\"}";
listParam2.add(obj0);
listParam2.add(obj1);
listParam2.add(obj2);

/////
List<Object> listParam1=new ArrayList<>();
listParam1.add("zhangsan");
listParam1.add("lisi");
listParam1.add(6);

/////
List<Object> listParam4=new ArrayList<>();
OrderInfo orderInfo1=new OrderInfo();
orderInfo1.setMoney(23);
orderInfo1.setId("NO.1");
OrderInfo orderInfo2=new OrderInfo();
orderInfo2.setMoney(24);
orderInfo2.setId("NO.2");
List listOrder=new ArrayList();
listOrder.add(orderInfo1);
listOrder.add(orderInfo2);
//[{"id":"NO.2","money":24},{"money":0}]
listParam4.add(JSON.toJSON(listOrder).toString());

List<Object> listParam6=new ArrayList<>();
listParam6.add("北京");

/*********************方法动态调用测试************************************/

for(int i=0;i<2;i++){
Long start=System.currentTimeMillis();
//多个参数情况
System.out.println(dynamicCallWebServiceByCXF(wsdlUrl,"sayHello2", "http://service.limp.com/","HelloServiceDemo",listParam1));
//单个对象
System.out.println(dynamicCallWebServiceByCXF(wsdlUrl,"selectOrderInfo", "http://service.limp.com/","HelloServiceDemo",listParam));
//多个对象
System.out.println(dynamicCallWebServiceByCXF(wsdlUrl,"selectOrderInfoAndOrderDetail", "http://service.limp.com/","HelloServiceDemo",listParam2));
//集合测试
System.out.println(dynamicCallWebServiceByCXF(wsdlUrl,"getOrderList", "http://service.limp.com/","HelloServiceDemo",listParam4));

//net创建的webservice通过其他方式获取
// System.out.println(dynamicCallWebServiceByCXF("http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl","getSupportCity",
// "http://WebXml.com.cn/","",listParam6));
Long end=System.currentTimeMillis();
System.out.println(i+"调用用时"+(end-start));
}
}

转载从https://blog.csdn.net/zzhuan_1/article/details/84499188

转载 CXF动态调用webservice的更多相关文章

  1. cxf动态调用webservice设置超时,测试线程安全

    Java代码 import java.util.Random; import java.util.concurrent.ArrayBlockingQueue; import java.util.con ...

  2. 动态调用webservice(部分转载)

    动态调用webservice,做个笔记: public class WSHelper { /// < summary> /// 动态调用web服务 /// < /summary> ...

  3. 用C#通过反射实现动态调用WebService 告别Web引用(转载)

    我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便.我想能够利用配置文件灵活调用WebService.如何实现呢? 用C#通过反射实现动态调用 ...

  4. Atitit 动态调用webservice与客户端代理方式调用

    Atitit 动态调用webservice与客户端代理方式调用 方式1: 使用call.invoke  直接调用WSDL,缺点:麻烦,不推荐--特别是JAVA调用.NET的WS时,会有不少的问题需要解 ...

  5. C# .NET 动态调用webservice的三种方式

    转载自 百度文库 http://wenku.baidu.com/link?url=Q2q50wohf5W6UX44zqotXFEe_XOMaib4UtI3BigaNwipOHKNETloMF4ax4W ...

  6. cxf动态调用wsdl的一个冲突以及解决

    cxf发布服务,调用服务的博客很多,这里也就简单贴一下代代码. 环境如下:spring+cxf (maven环境) <cxf.version>2.7.11</cxf.version& ...

  7. 动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法

    [导读]ServiceDescriptionImporter是创建Web Service 时使用的类,它是引用继承System.Web.Services 当我将VS2005里写的一段代码放在VS201 ...

  8. 浅谈WebService开发三(动态调用WebService)转

    在前两讲里,我已经向大家演示了如何使用WebService.同步, 异步调用WebService,而在实际开发过程中,可能会有多个WebService接口供你选择,而在程序执行过程中才决定使用哪一个 ...

  9. 动态调用WebService(C#) (非常实用)

    通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名 ...

随机推荐

  1. 使用visual studio 2013读取.mat文件

    现在有一个T.mat 文件需要在c++中处理然后以.mat 或是.txt形式返回 T.mat中存储了十个cell,每个cell中会有一个不等长的数组 1.以下是相关配置过程: 参考:http://we ...

  2. 按照相应的格式获取系统时间并将其转化为SQL中匹配的(date)时间格式

    在获取时间时需要对时间格式进行设置,此时就需要用到SimpleDateFormat 类 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM ...

  3. golang学习笔记(二):流程控制

    欢迎访问我的博客和github! 今天咱们把烦人的事情丢一丢,继续来学习go的基础知识. 这篇文章记录go语言的流程控制和更多类型. 流程控制 for Go 只有一种循环结构:for 循环. 基本的 ...

  4. remote: error: hook declined to update refs/heads

    打开工程目录下.git/config文件,补充user信息 , [user] username = xxx email = xxx@126.com 打开工程目录下.git/description文件, ...

  5. CCF_ 201512-4_送货

    一道拖了很久了题,用bool开的vis不会爆内存,dfs回溯的话会超时,于是有了一个很巧妙的dfs. #include<iostream> #include<cstring> ...

  6. BZOJ 1614 [Usaco2007 Jan]Telephone Lines架设电话线 (二分+最短路)

    题意: 给一个2e4带正边权的图,可以免费k个边,一条路径的花费为路径上边权最大值,问你1到n的最小花费 思路: 对于一个x,我们如果将大于等于x的边权全部免费,那么至少需要免费的边的数量就是 “设大 ...

  7. Codeforces 1062B Math(质因数分解)

    题意: 给一个数n,可以将它乘任意数,或者开方,问你能得到的最小数是多少,并给出最小操作次数 思路: 能将这个数变小的操作只能是开方,所以构成的最小数一定是 $n = p_1*p_2*p_3*\dot ...

  8. Dapper系列 作者:懒懒的程序员一枚

    Dapper 第一篇简单介绍什么是小巧玲珑?Dapper如何工作安装需求方法参数结果常用类型 Dapper 第二篇 Execute 方法介绍描述存储过程Insert语句Update语句Delete语句 ...

  9. 解决mysql登录报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)问题

    问题描述: 在ubuntu14.04上安装完MYSQL后,MYSQL默认给分配了一个默认密码,但当自己在终端上使用默认密码登录的时候,总会提示一个授权失败的错误. 报错信息:Access denied ...

  10. 杭电-------2051Bitset(C语言)

    #include<stdio.h> ] = { }; int main() { int m; ; while (~scanf("%d", &m)) { whil ...