在上一篇中写了一个简单了webservice,实现了一个sayHello功能。那么webservice写好之后我们如何使用Java程序来调用webservice呢?

一、java调用的webservice的第一种方式:RPC调用AXIS2 webservice
    下面这个方法是我抽象出来的一个方法,

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; public class Client { /**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// 调用PublishWebService
String wsdlUrl = "http://localhost:8080/DigitalProduct/services/PublishWebService?wsdl";//webservice地址
String method = "updatePublishSysParam"; //调用的那个方法
Object[] param = new Object[] { "AASSDDFF" };//传递的参数值
String namespaceUrl1 = "http://service.digitalproduct.tkbs.com";//命名空间
Class[] opReturnType1 = new Class[] { String[].class };//返回值类型
String result = axis2RPCInvoke(wsdlUrl, method, param, namespaceUrl1,opReturnType1);
System.out.println(result);
}
/**
* RPC调用AXIS2 webservice
*
* @param wsdlUrl
* 服务地址 如:http://192.168.0.1:2597/aixs2/services/jqservice?wsdl
* @param methodName
* 方法名 如<xs:element name="Receive">
* @param parameter
* 方法参数 如Object[] opArgs = new Object[] { param };
* @param namespaceURI
* 命名空间 如 :targetNamespace="http://server.test.com.cn">
* @param returnType
* 返回类型 如字符串:Class[] opReturnType = new Class[] { String[].class
* };
*/
public static String axis2RPCInvoke(String wsdlUrl, String methodName,
Object[] parameter, String namespaceURI, Class[] returnType) {
Object[] ret = null;
RPCServiceClient serviceClient = null;
try {
/*
* 此处RPCServiceClient 对象实例建议定义成类中的static变量 ,否则多次调用会出现连接超时的错误。
*/
serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
EndpointReference targetEPR = new EndpointReference(wsdlUrl);
options.setTo(targetEPR);
QName opQName = new QName(namespaceURI, methodName);
ret = serviceClient.invokeBlocking(opQName, parameter, returnType);
// System.out.println(((String[]) ret[0])[0]);
} catch (AxisFault e) {
e.printStackTrace();
}
return ((String[]) ret[0])[0];
}
}

二、使用java调用webservice的第二种方式:使用myeclipse中的axis2插件生成客户端代码

new -->others到如下界面:

    点next 到如下界面:

现在我们想生成调用webservice的客户端代码,首先我们需要生成一个service.wsdl文件,选择第2个,点next,

在界面里边点击add folder 选择项目--》webroot--》webinf-->classes,输入好webservice那个类的全名后点击Test Class Loading ,这时候如果你选择的路径是对的,类全名是对的,就可以点next,否则next按钮式灰色的。如图:

然后点击next,这个界面中的内容基本不用修改,有一个service name ,你可以改成你自己取。

继续点next 在界面中选择wsdl文件的输出路径,选择第一个,就是输出到当前的workspace,的某个项目下,选择第二个,就是输出到系统文件夹中,例如你可以选择桌面。

这里我选择第二个,然后点browse选择桌面,点finish,会看到桌面上有一个service.wsdl文件。

下面我们就可以根据这个wsdl文件生成客户端代码了。

首先建一个java项目,例如取名myclient

new -->others-->

选择第1个,点next.

在界面中点 browse找到你刚才生成service.wsdl文件。

点next,这个界面不用管,继续点next

这个时候需要选择代码生成的地方,选择当前工作的workspace,然后选择刚才新建的myclient如图:

点finsh,刷新myclient项目会看到src下多了两个java文件:TestServiceCallbackHandler   和 TestServiceStub

接下来就可以写java代码调用了,如下:

import myservice.service.TestServiceStub;

public class Test {

    /**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//初始化Sub类
TestServiceStub stub = new TestServiceStub();
//传递AxisServiceStub.ShowName对象,相关参数在这边赋值。
TestServiceStub.SayHello command = new TestServiceStub.SayHello();
command.setName("zhangsan");
//取得返回值
String name = stub.sayHello(command).get_return();
System.out.println(name);
} }

如此,第二种方式就写完了。

公司几个同事都喜欢第二种。但是,我个人喜欢用第一种。第二种方式如果插件使用熟练的话,很快就可以生产客户端代码,然后测试代码也可以很快写出来。

注:可能会出现错误,根据我的经历的错误经验,有以下情况:

1.tomcat端口问题,你打开刚才插架自动生成的TestServiceStub 类 ctrl+f查找 http://localhost,查到后看他后面的端口是多少,是不是8080,?好像生成的就是8080,但是我们的tomcat可能被自己修改过,端口可能不是8080,所以这里你要改这个端口。

2.spring的注入问题,如果你写的webservice是在spring整合的环境下,可能会报错误,一般是由 spring注入失败,导致xxxService类注入失败。关于这个我下一篇会详细解释。

3.一切都正常,打断点调试看到方法执行成功了、执行完毕了,但是并没有成功的返回我们要的结果,而是报超时了,这时候,我们需要在TestServiceStub 中加入一行代码

这行代码的作用是 规定超时时间 是多长,例如你可以设为10分钟。_operationClient.getOptions().setTimeOutInMilliSeconds(600000L);  //600*1000毫秒(10分钟

我感觉这样设置不合理,但是可以解决这个错误,让你的程序运行成功,看到运行成功返回的结果。才有继续学习的劲头啊。

Axis2 webservice 之使用java调用webservice的更多相关文章

  1. Java调用WebService方法总结(5)--Axis2调用WebService

    Axis2是新一点Axis,基于新的体系结构进行了全新编写,有更强的灵活性并可扩展到新的体系结构.文中demo所使用到的软件版本:Java 1.8.0_191.Axis2 1.7.9. 1.准备 参考 ...

  2. java 调用webservice的各种方法总结

    java 调用webservice的各种方法总结 几种流行的开源WebService框架Axis1,Axis2,Xfire,CXF,JWS比较 方法一:创建基于JAX-WS的webservice(包括 ...

  3. Java调用WebService方法总结(1)--准备工作

    WebService是一种跨编程语言.跨操作系统平台的远程调用技术,已存在很多年了,很多接口也都是通过WebService方式来发布的:本系列文章主要介绍Java调用WebService的各种方法,使 ...

  4. Java调用webservice接口方法

                             java调用webservice接口   webservice的 发布一般都是使用WSDL(web service descriptive langu ...

  5. java调用webservice,restful

    java调用webservice public String redoEsb(String loguid, String user, String comments, String newMsg, S ...

  6. 原生java调用webservice的方法,不用生成客户端代码

    原生java调用webservice的方法,不用生成客户端代码 2015年10月29日 16:46:59 阅读数:1455 <span style="font-family: Aria ...

  7. Java调用Webservice(asmx)的几个例子

    Java调用Webservice(asmx)的几个例子 2009-06-28 17:07 写了几个调用例子: 1. import org.apache.axis.client.*;import org ...

  8. Java调用WebService方法总结(9,end)--Http方式调用WebService

    Http方式调用WebService,直接发送soap消息到服务端,然后自己解析服务端返回的结果,这种方式比较简单粗暴,也很好用:soap消息可以通过SoapUI来生成,也很方便.文中所使用到的软件版 ...

  9. Java调用WebService方法总结(8)--soap.jar调用WebService

    Apache的soap.jar是一种历史很久远的WebService技术,大概是2001年左右的技术,所需soap.jar可以在http://archive.apache.org/dist/ws/so ...

随机推荐

  1. Sbt的使用初步和用sbt插件生成eclipse工程

    以前一直是用maven去管理java项目,现在开始写scala项目了但是在scala-ide中去编译scala项目和sbt的区别一直没弄清楚受到文章:http://my.oschina.net/yjw ...

  2. SublimeText2 快捷键

    前端神器Sublime Text3使用说明:http://www.jianshu.com/p/1f2463261ded SublimeText2 快捷键,与对应功能一览表: 快捷键 功能 ctrl+s ...

  3. 进程&线程

    进程与线程的区别 什么是进程(Process):普通的解释就是,进程是程序的一次执行,而什么是线程(Thread),线程可以理解为进程中的执行的一段程序片段.在一个多任务环境中下面的概念可以帮助我们理 ...

  4. Doragon Kuesuto 1.15

    #include<stdio.h> #include<stdlib.h> #include<time.h> int main() { ; ; ; int actio ...

  5. 笔记本_thinkpad_e40

    1. 0578A69 2.驱动下载 相关地址 XPhttp://think.lenovo.com.cn/support/driver/detail.aspx?docID=DR1253259153348 ...

  6. SQL & PL/SQL 模块总结

    SQL 1. 各种function 2. merge 3. connect by PL/SQL 1. pl/sql 寄出 2. 游标 3. procedure 4. function 5. packa ...

  7. C#操作Excel数据增删改查(转)

    C#操作Excel数据增删改查. 首先创建ExcelDB.xlsx文件,并添加两张工作表. 工作表1: UserInfo表,字段:UserId.UserName.Age.Address.CreateT ...

  8. Path,Files巩固,题目:从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中

    这个题目用传统的File,InputStream可以做,但是如果用Files,Path类做,虽然思路上会困难一些,但是代码简洁了很多,以下是代码: import java.io.IOException ...

  9. gdufs 1237 最优分解问题

    题目链接:http://cstfs.gdufs.edu.cn:8080/JudgeOnline/problem.jsp?id=1237 (好像是内网的0.0) 简单来说,这道题目就是把一个数分解为若干 ...

  10. 怎么进入BAT的研发部门?

    怎么进入BAT的研发部门? ======================================剑指offer+leetcode+geeksforgeeks+编程之美+算法导论====秒杀BA ...