一定时动态、动态、动态...不是动态就不是想要的办理方案。
(本篇正在更新中..可以关注后,持续磋商)

一.方案汇总

网上查询的很多资料,零零散散没有找到一个比较满意的方案,特地汇总一下办理方案。

php调用webserviceasmxJava动态挪用庞杂参数的WebService精选汇总篇一 Ruby

目前办理方案暂定为3种

1.利用cxf动态调用webservice

2.利用axis2的RPC办法调用webservice

3.利用HttpClient调用webservice

二.问题阐发

1.利用cxf动态调用webservice

查询资料后,首先说下cxf的办理方案。

1.1大略类型的动态调用如下

定义方法WebService方法:

package com.limp.service;import com.limp.domain.OrderInfo;import javax.jws.WebMethod;import javax.jws.WebService;import java.util.HashMap;import java.util.List;import java.util.Map;/ @intro : @auth : shinians @time : 2018/11/21 16:56 @website: www.shinians.com /@WebServicepublic interface HelloService { / 你好,webservice @param name @return / @WebMethod String sayHello(String name); @WebMethod String sayHello2(String name,String name2); @WebMethod String testMap(HashMap<String,String> param,String name); @WebMethod String testListMap(List<HashMap<String,String>>listMap); / 啊 碰着这个问题 便是Webservice不能通报Map类型的数据。
webservice可以处理String 基本数据类型,普通POJO、list 数组。
以是将map进行转换吧。
@param mapOrder @return /// @WebMethod// String getMapOrder(Map<String,OrderInfo> mapOrder); @WebMethod(action = \"大众process\"大众) String getOrder(OrderInfo order); @WebMethod String getOrderList(List<OrderInfo> orders);}

以 String sayHello(String name)为例,调用办法如下(动态参数须要自行封装)。

/ 大略类型的调用(String): /public static void SimpleInvoke(){// 创建动态客户端JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();Client client = dcf.createClient(wsdlUrl);// 须要密码的情形须要加上用户名和密码// client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME,PASS_WORD));Object[] objects = new Object[0];try {// invoke(\"大众方法名\"大众,参数1,参数2,参数3....);objects = client.invoke(\"大众sayHello\"大众, \公众张三\"大众);System.out.println(\公众返回数据:\"大众 + objects[0]);} catch (java.lang.Exception e) {e.printStackTrace();}}

调用成功返回结果如下

1.2繁芜工具形式调用

对付大略类型调用网上一搜到处都是办理方案,但是对付繁芜工具形式传参如何办理呢?

以 String getOrder(OrderInfo order);方法为例

测试方法如下:

/ 工具传参 /public static void pojoInvoke(){// 创建动态客户端JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();Client client = dcf.createClient(wsdlUrl);Object[] objects = new Object[0];try {//通过反射,创建OrderInfo工具,com.limp.service.OrderInfo 这个包名称必须和webservice的中的order路径同等Object order = Thread.currentThread().getContextClassLoader().loadClass(\公众com.limp.service.OrderInfo\"大众).newInstance();//初始化实体工具Method m = order.getClass().getMethod(\"大众setId\"大众, String.class);Method m1 = order.getClass().getMethod(\公众setMoney\公众, double.class);Method m2 = order.getClass().getMethod(\"大众setOrderNo\公众, String.class);m.invoke(order, \"大众uuid213-281heq-2131\"大众);m1.invoke(order, 23);m2.invoke(order, \"大众NO110\"大众);//开始调用objects = client.invoke(\"大众getOrder\"大众, order);System.out.println(\"大众调用工具形式参数返回数据:\公众 + objects[0]);} catch (java.lang.Exception e) {e.printStackTrace();}}

java.lang.NoSuchMethodException: com.limp.service.OrderInfo.setMoney(java.lang.Double) -->将Double.class改成double.class总之时保持同等

这是网上搜到的一个办理方法,但是Thread.currentThread().getContextClassLoader().loadClass(“com.limp.service.OrderInfo\"大众) 这个com.limp.service.OrderInfo包路径你是怎么知道的呢,如果做事端是在另一个单位,这个路径你通过什么方法知道的呢,否则还是不能称为动态调用啊。
(其他人的疑问,实在我也是这样疑问的,总之这还不是彻底的办理方案,算不上动态呀,但是,总归是能有调通的可能性)

工具调用扩展篇章如下(同时办理调用返回慢的问题)

还是以上面的为例。

参考下面这个两个例子(抱歉暂时没弄成功,先用其他办法弄)

http://cxf.apache.org/docs/dynamic-clients.html

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

更新出炉,完备办理动态调用过程,包含多种情形处理,参考以下博文

博文链接:cxf动态调用webservice(参数包含多个形参、List凑集、JAVABean工具)

net写的webservice用cxf调用会有问题。
如下面链接

http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?op=getSupportDataSet

初步办理方案:采取其他的办法调用,如httpclient