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 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 callback(String method,Class clazz) throws AxisFault
{
return callback(method,new Object[]{},clazz);
}
/**
* 调用 method 方法,传递一个参数param
* 有返回值,返回值类型 clazz
*/
public
T callback(String method,Object param,Class clazz) throws AxisFault
{
return callback(method,new Object[]{param}, clazz);
}
/**
* 调用 method 方法,传递多个参数param
* 有返回值,返回值类型 clazz
*/
@SuppressWarnings("unchecked")
public T callback(String method,Object[] param,Class 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,method);
serviceClient.invokeBlocking(opName,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