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,Class<T> clazz) throws AxisFault
{
return callback(method,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,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));
}else
{
return callback(method.getName(),args,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;
}
}

[置顶] WebService调用工具(AXIS2)的更多相关文章

  1. [置顶] WebService学习总结(1)——WebService相关概念

    一.序言 大家或多或少都听过 WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成 分.但是不得不承认的是W ...

  2. [置顶] WebService学习总结(4)——第三方webService服务调用

    互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取天气预报数据和查询国内手机号码归属地为 ...

  3. [置顶] WebService学习总结(3)——使用java JDK开发WebService

    一.WebService的开发手段 使用Java开发WebService时可以使用以下两种开发手段 1. 使用JDK开发(1.6及以上版本) 2.使用CXF框架开发(工作中) 二.使用JDK开发Web ...

  4. [置顶] PHP调用move_uploaded_file()提示 failed to open stream: Permission denied(Linxux环境,以Ubuntu12.04为例)

    在使用PHP上传文件之后,我们有时候还需要移动到特定的文件夹,这时候就要调用move_uploaded_file()函数,可是会出现如下错误: Warning: move_uploaded_file( ...

  5. [置顶] android调用第三方库——第四篇——调用多个第三方库

    0:前言: 在前面三篇中我们介绍了android调用第三方库的形式,在这一篇中我们介绍调用多个第三方库的Android.mk的写法,由于其他三篇介绍的很详细,这里只给出Android.mk的内容. [ ...

  6. [置顶] Java WebService接口生成和调用 图文详解

    webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...

  7. 转--Android中调用webservice的工具类

    最近学习WebService,感觉利用这个借口开发网站的Android客户端方便及了,用到一个工具类,这里铭记一下. public static final String WebServiceName ...

  8. 纯 Java 开发 WebService 调用测试工具(wsCaller.jar)

    注:本文来自hacpai.com:Tanken的<纯 Java 开发 WebService 调用测试工具(wsCaller.jar)>的文章 基于 Java 开发的 WebService ...

  9. 019 [工具软件]窗体置顶 DeskPins

    DeskPins:Windows下将任何窗体置顶的工具 官方主页:https://efotinis.neocities.org/deskpins/index.html 官方下载的是一个exe安装包,用 ...

随机推荐

  1. brief InformationTechnology theory of evolution

    信息技术进化论简述 无文化流氓帮帮主Ruiy Pk 清华土匪帮帮主YiC 1,按人机交互方式 命令行-->图形界面-->自然交互(语音+手控) Tips:命令行(IBM大型机,小型机+ S ...

  2. Pat(Advanced Level)Practice--1043(Is It a Binary Search Tree)

    Pat1043代码 题目描写叙述: A Binary Search Tree (BST) is recursively defined as a binary tree which has the f ...

  3. iOS隐藏tabBar的方法

    两种方法用来隐藏tabBar 1.在本页面隐藏 #pragma mark - 隐藏tabBar - (void)viewWillAppear:(BOOL)animated{ self.tabBarCo ...

  4. DataGridView插入一行数据和用DataTable绑定数据2种方式

    以前不会用DataGridView的时候一直使用DataTable绑定的方式,如下: DataTable table = new DataTable(); //给表添加一列Name,此名字和 tabl ...

  5. ROS中编辑文件命令行工具rosed

    rosed是rosbash套件中的一个,它允许我们通过包名直接编辑包中的文件,而不是输入包的全部路径. 用法: rosed [package_name] [filename] 例如: rosed ro ...

  6. Oracle游标使用详解

    转自:http://www.cnblogs.com/sc-xx/archive/2011/12/03/2275084.html 声明游标:CURSOR cursor_name IS select_st ...

  7. Java基础之静态变量

    public class StaticVariable { public static void main(String[] args) { Person p1 = new Person(); Per ...

  8. 利用Console来调试JS程序、Console用法总结

    http://blog.163.com/zhangmihuo_2007/blog/static/27011075201452522824347/ http://blog.163.com/zhangmi ...

  9. [转]printf 函数实现的深入剖析

    研究printf的实现,首先来看看printf函数的函数体 int printf(const char *fmt, ...) { int i; char buf[256];          va_l ...

  10. 未能从程序集“System.ServiceModel, Version=3.0.0.0”中加载类型“System.ServiceModel.Activation.HttpModule” 的解决办法

    未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中加载类型“ ...