一定时动态、动态、动态...不是动态就不是想要的办理方案。(本篇正在更新中..可以关注后,持续磋商)
一.方案汇总
网上查询的很多资料,零零散散没有找到一个比较满意的方案,特地汇总一下办理方案。
目前办理方案暂定为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