大家都知道,CXF提供了两种创建客户端的方式:一种是使用cxf提供的wsdl2java命令生成客户端,另一种就是动态创建客户端。关于第一种方式,就是直接将远程提供的类信息在本地生成,原理很简单。关键是动态调用并且方法参数为复杂对象时,这种方式是通过动态加载(加载到内存,并且只在当前线程中有效)需要使用到的远程的类信息,来完成客户端的创建以及远程方法的调用,使用方式如下:
1、 首先创建动态客户端工厂:
<span class="lnum" style="color: rgb(96, 96, 96);"> 1: </span>JaxWsDynamicClientFactory dynamicClient = JaxWsDynamicClientFactory.newInstance();
2、创建客户端对象:
3、创建远程方法需要使用的对象参数,并为对象属性赋值:
<span class="lnum" style="color: rgb(96, 96, 96);"> 1: </span>Object orderSplit = Thread.currentThread().getContextClassLoader()
2: .loadClass("com.jd.wmc.service.OrderSplit").newInstance();
<span class="lnum" style="color: rgb(96, 96, 96);"> 3: </span> Method setCky = orderSplit.getClass().getMethod(<span class="str" style="color: rgb(0, 96, 128);">"setCky2"</span>,
4: String.class);
<span class="lnum" style="color: rgb(96, 96, 96);"> 5: </span> setCky.invoke(orderSplit, Configuration.getConfiguration()
6: .getValue("cky2"));
<span class="lnum" style="color: rgb(96, 96, 96);"> 7: </span> Method setStoreId = orderSplit.getClass().getMethod(<span class="str" style="color: rgb(0, 96, 128);">"setStoreId"</span>,
8: String.class);
<span class="lnum" style="color: rgb(96, 96, 96);"> 9: </span> setStoreId.invoke(orderSplit, Configuration.getConfiguration()
10: .getValue("storeid"));
<span class="lnum" style="color: rgb(96, 96, 96);"> 11: </span> Method setWareHouse = orderSplit.getClass().getMethod(
12: "setWareHouse", String.class);
<span class="lnum" style="color: rgb(96, 96, 96);"> 13: </span> setWareHouse.invoke(orderSplit, Configuration.getConfiguration()
14: .getValue("cky2")
<span class="lnum" style="color: rgb(96, 96, 96);"> 15: </span> + Configuration.getConfiguration().getValue(<span class="str" style="color: rgb(0, 96, 128);">"storeid"</span>));
16: Method setCount = orderSplit.getClass().getMethod("setCount",
<span class="lnum" style="color: rgb(96, 96, 96);"> 17: </span> Integer.<span class="kwrd" style="color: rgb(0, 0, 255);">class</span>);
18: setCount.invoke(orderSplit, count);
4、调用远程方法:
<span class="lnum" style="color: rgb(96, 96, 96);"> 1: </span>client.invoke(methodName, <span class="kwrd" style="color: rgb(0, 0, 255);">new</span> Object[] { orderSplit });
注意:客户端的创建一定要保证和创建参数对象时在同一个线程,否则将抛出找不到类的异常。