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. 枚举与剪枝_观察算式(比标准答案还要牛B)

    观察算式 观察以下的算式: △△△ * △△ = △△△△ 某3位数乘以2位数,结果为4位数 要求:在9个△所代表的数字中.1~9的数字恰好每一个出现1次. 暴力破解代码: package lianx ...

  2. 一个cocoapods问题的解决,希望能帮助到遇到相似情况的人

    之前10.7的系统上执行过cocoapods没有问题.如今系统版本号升级到了10.9,尝试使用cocoapods遇到问题,报告了类似以下的错误: Psych::SyntaxError - (/User ...

  3. CString 与 std::string 相互转化

    MFC中CString 与 std::string 相互转化 CString实际是CStringT, 也就是模板类, 在UNICODE环境下,实际是CStringW, 在多字符集环境下,实际是CStr ...

  4. javascript 获取调用属性的对象

    最近碰到一个javascript 的小问题,是和闭包有关的,来自cnode 论坛,很有意思. var o = (function() { var person = { name: 'Vincent', ...

  5. IIS7.0/7.5 MVC3 实现伪静态

    routes.MapRoute(            "Default",            "{controller}/{action}.html/{id}&qu ...

  6. 关于消息推送和service的一些调查-清理内存通知栏点击无响应

    起因:做了两个带推送的app:HiApp和WeApp,前者个推,后者百度推送,但前者有一个小缺陷. 现象:两部手机 1.htcD820t手机,运行中的app利用自带的关闭最近程序后,通知栏不清理该ap ...

  7. 2014.9.16HTML表单CSS

    (一)表格 合并单元格(少用) (合并列) 1.先选中要合并的2个或多个单元格,然后点击以下图标 代码:<td colspan="2"> </td> 2.设 ...

  8. ubuntu菜单面板丢了怎么找回

    我的ubuntu菜单面板丢了.   我的ubuntu用的是gnome桌面环境,桌面环境分为三个区域: 1.菜单面板 (1)三个主菜单:应用程序,位置,系统. (2)快速启动区:菜单面板中间的部分称为快 ...

  9. Nginx启动报错:10013: An attempt was made to access a socket in a way forbidden

    Nginx在win7,win2008下启动报错:bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket i ...

  10. python 学习之Windows 下的编码处理!

    问题1: Non-ASCII character '\xe9' in file 问题原因:程序编码上出现问题 解决方法:在程序头部加上代码 #-*- coding: UTF-8 -*- 设置代码编码为 ...