package com.Metarnet.util; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Proxy; import java.lang.reflect.Type; import java.util.Arrays; import java.util.List; import javax.xml.namespace.QName; import org.apache.axis2.AxisFault; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.rpc.client.RPCServiceClient; /** * WebService调用工具 * 用法: * 1:(推荐)WebServiceUtil.create(发布地址,命名空间,接口类); * 创建的对象可以直接当成本地接口调用,例如 * WebService service = WebServiceUtil.create("http://localhost:8080/test/cxf/webservice",* "http://www.yanfan.com/",WebService.class); * List<CeicsNeinfo> list = service.selectNeList(); * 2:创建Util方式 WebServiceUtil util = new WebServiceUtil( "http://127.0.0.1:8090/Metarnetos_v3/cxf/webservice","http://www.Metarnet.com/"); CeicsNeinfo[] tasks = util.callback("selectNeList",CeicsNeinfo[].class); * * @author YANFAN */ public class WebServiceUtil implements InvocationHandler{ private RPCServiceClient serviceClient; private String nameSpace;//命名空间 private int timeout = 30;//超时时间,单位:秒 public WebServiceUtil(String endpoint,String nameSpace) throws AxisFault{ serviceClient = new RPCServiceClient(); Options options = serviceClient.getoptions(); EndpointReference targetEPR = new EndpointReference(endpoint); options.setTo(targetEPR); options.setTimeOutInMilliSeconds(timeout*1000); this.nameSpace = nameSpace; } /** * 调用 method 方法 * 有返回值,返回值类型 clazz */ public <T> T callback(String method,Class<T> clazz) throws AxisFault { return callback(method,new Object[]{},clazz); } /** * 调用 method 方法,传递一个参数param * 有返回值,返回值类型 clazz */ public <T> T callback(String method,Object param,new Object[]{param},clazz); } /** * 调用 method 方法,传递多个参数param * 有返回值,返回值类型 clazz */ @SuppressWarnings("unchecked") public <T> T callback(String method,Object[] param,Class<T> clazz) throws AxisFault { QName opName = new QName(nameSpace,method); Class<?>[] returnTypes = new Class[]{clazz}; T[] results = (T[]) serviceClient.invokeBlocking(opName,param,returnTypes); return results[0]; } /** * 调用 method 方法 * 无返回值 */ public void call(String method) throws AxisFault { QName opName = new QName(nameSpace,method); serviceClient.invokeBlocking(opName,new Object[]{}); } /** * 调用 method 方法,传递多个参数param * 无返回值 */ public void call(String method,Object[] param) throws AxisFault { QName opName = new QName(nameSpace,param); } @Override public Object invoke(Object proxy,Method method,Object[] args) throws Throwable { Class<?> retType = method.getReturnType(); if(args == null){args=new Object[]{};} if(retType!=null) { if(retType.isAssignableFrom(List.class)) { Type type = method.getGenericReturnType(); if (type instanceof ParameterizedType) { retType = (Class<?>)((ParameterizedType) type).getActualTypeArguments()[0]; retType = java.lang.reflect.Array.newInstance(retType,2).getClass(); } return Arrays.asList((Object[]) callback(method.getName(),args,retType)); }else { return callback(method.getName(),retType); } }else { call(method.getName(),args); return null; } } /** * 创建代理对象 * @throws IllegalArgumentException * @throws AxisFault */ @SuppressWarnings("unchecked") public static <T> T create(String endpoint,String nameSpace,Class<T> clazz) throws AxisFault,IllegalArgumentException { ClassLoader loader = clazz.getClassLoader(); Class<?>[] proxy = new Class[]{clazz}; T t =(T) Proxy.newProxyInstance(loader,proxy,new WebServiceUtil(endpoint,nameSpace)); return t; } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。