axis2实现webservice服务
采用java1.8, axis2为1.7.8
服务端实现
服务端采用先实现java代码,然后使用工具java2wsdl
产生wsdl文件,之后
再通过wsdl2java
产生服务端代码。
public class MyServerImpl implements MyServer {
@Override
public String sayHi(String name) {
return "Hello " + name;
}
}
interface
部分省略。
java2wsdl产生wsdl文件
上面的代码,需要编译,使用idea编译后如下图:
打开cmd,进入out/production/AxisDemo2目录
执行命令java2wsdl
,
wsdl2java -cp . -cn com.demo.ws.server.MyServerImpl
如图
之后会在当前目录产生MyServerImpl.wsdl文件。
wsdl2java产生服务端代码
切换命令行到工程目录下
使用命令
wsdl2java -ssi -ss -sd -a -g -t -uri ./out/production/AxisDemo2/MyServerImpl.wsdl
-a 是产生异步调用
-t 产生测试代码,参照接口调用编写客户端代码
-ssi 实现接口类
-ss 实现服务端代码
-sd 产生服务描述文件 默认文件名 services.xml
-g 会产生客户端代码
运行后,会产生src,resources,test三个文件夹,以及ant脚本build.xml文件如下:
实现webservice代码逻辑
实现MyServerImplSkeleton
类中的方法,步骤大致如下:
1. 删除默认的throw new Exception
2. 获取入参取值
3. 实现业务逻辑
4. 初始化返回对象
5. 给返回对象赋值
6. 返回
代码如下:
public com.demo.ws.server.SayHiResponse sayHi(
com.demo.ws.server.SayHi sayHi0) {
//TODO : fill this with the necessary business logic
// throw new java.lang.UnsupportedOperationException("Please implement " +
// this.getClass().getName() + "#sayHi");
System.out.println("invoke sayHi " + sayHi0.getName());
SayHiResponse resp = new SayHiResponse();
resp.set_return("hello " + sayHi0.getName());
return resp;
}
执行ant
命令,得到MyServerImpl.aar包。
执行 ant start.server
,可以运行,如下图:
可以通过页面访问 http://127.0.0.1:8080/axis2/services/ 看到服务已经启动。
客户端实现
上面wsdl2java
添加了-g
已经产生了客户端代码,可以直接编写逻辑代码。
- 初始化Stub对象
- 初始化入参对象
- 给入参对象赋值,调用各个 setXXX方法
- 使用stub对象实现远程调用
通过页面查看wsdl时的url路径,作为stub初始化参数。
客户端代码如下:
public class Client {
String uri = "http://127.0.0.1:8080/axis2/services/MyServerImpl?wsdl";
MyServerImplStub stub = null;
Client() throws AxisFault {
stub = new MyServerImplStub(this.uri);
}
public void sayHi(String name) throws RemoteException {
SayHi sayHi = new SayHi();
sayHi.setName(name);
stub.startsayHi(sayHi, new MyServerImplHandler());
}
public static void main(String[] args) {
try {
Client c = new Client();
c.sayHi("Robin");
Thread.sleep(1000);
} catch (RemoteException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
由于采用的异步接口,需要实现回调处理返回的结果:
public class MyServerImplHandler extends MyServerImplCallbackHandler {
@Override
public void receiveResultsayHi(SayHiResponse result) {
super.receiveResultsayHi(result);
System.out.println("sayHi resp: " + result.get_return());
}
@Override
public void receiveErrorsayHi(Exception e) {
super.receiveErrorsayHi(e);
System.out.println("err call sayHi " + e);
}
}
到这里,可以使用ant jar.client
编译客户端代码了。
如果需要在idea中运行,需要添加axis中的lib库,
\axis2-1.7.8\webapp\WEB-INF\lib\
\axis2-1.7.8\lib\
运行client输出如下:
服务器输出如下: