Axis2 webservice配置
此种方法配置可以部署在任务机器上,不管你是部署在web容器中还是非web容器中,只要你机器上有jvm就可以运行。具体看下面这个图。
大概需要四块地方,一个是我们要写的接口类;还有就是axis2.xml这个配置文件(主要是配置端口),还有就是libs里面的jar包;另外就是reposrtory的几个包,addression-1.5.mar这个包可以不用管,webservice.aar这外包自己打的,里面主要是一个services.xml文件。我们先一个一个说说。
1、 所需jar包
自己去下吧,我把所需的列出来。
还是蛮多的,可能有些是不需要的,自己试着看吧。
2、 axis2.xml
这个文件只改一下端口就行,把端口改成你自己的。其他的都不需要改
true
false
false
false
false
admin
axis2
false
false
8099
HTTP/1.1
chunked
HTTP/1.1
chunked
true
true
multicast
apache.axis2.domain
apache.axis2.application.domain
true
10
228.0.0.4
45564
500
3000
127.0.0.1
127.0.0.1
4000
true
true
127.0.0.1
4000
127.0.0.1
4001
3、 repository目录配置
这个目录下必须包含上图中的两个目录,里面的文件就需要改webservice.aar(这里的名字可以改成自己的,后缀为aar就行),把这个文件用解压缩软件打开,把里面的services.xml文件解压出来修改,修改好后再放进去。
上面三个地方分别是名称,描述,和你的webservice接口类,改一下就OK了。
WebService
com.webservice.ws.service.WebServiceNode
4、 webservice接口类
WebServiceNode.java
package com.webservice.ws.service;
import java.util.ArrayList;
import java.util.List;
import com.webservice.ws.model.User;
public class WebServiceNode {
public String getString(){
return "sssssssssss";
}
public User getUser(){
User user = new User();
user.setUserCode("test");
user.setUserName("userName");
return user;
}
public List
getUserList(){
List list = new ArrayList();
User user = new User();
user.setUserCode("test1");
user.setUserName("userName1");
list.add(user);
user = new User();
user.setUserCode("test2");
user.setUserName("userName2");
list.add(user);
return list;
}
}
看到了吧,就普通的类的,只要把想要的东西返回去就行了,这里需要注意一点,
在返回集合的时候,比如我这里是List,在我这里没有问题,但是有时候可能会有问题,问题在于你返的list中包含的是一个对象。这个对象必须是其他webservice方法中或者是参数中出现过。什么意思?比如我这里的User类因为在第二个方法public User getUser()中的返回类型中出现了,所以后面返回的list没问题,如果我将第二个方法注释掉,第三个方法就会有问题。因为对象User没有被解释,客户端在把它转成User的时候就会报错,如果把第二方法加上,那么就把User解释成xml文件了,第三个方法传到客户端就能解释。这里也就是要求list中的对象必须在你的webservice接口中的返回值中或是参数中出现过。
我们看看他的解释。如下图,
看已经解释了,如果这里没解释,客户端就不能把它转成Userod 。这个类就说到这里
还有一个重要类
WebService类,这个类也可以不要,因为这个类是继承axis2的,如果不要我们就直接用他的父类。因为我们继承他也没做任何事。所以可以不要。
package com.webservice.ws.service;
import org.apache.axis2.AxisFault;
import org.apache.axis2.transport.SimpleAxis2Server;
public class WebService extends SimpleAxis2Server {
public WebService(String repoLocation, String confLocation)
throws Exception {
super(repoLocation, confLocation);
}
public void start() throws AxisFault {
super.start();
}
}
就两个方法都是父类的,如果不要,我们就直接用SimpleAxis2Server这个父类。下面看如何启动webservice。写一个main方法调用这里的start就可以了,只不过在调用前实例化时需要传两个参数,这两个参数就是axis2.xml和repository的路径。
如果不要这个类就用SimpleAxis2Server ws = new SimpleAxis2Server(repository,axis2);
package com.webservice.ws.main;
import java.io.File;
import com.webservice.ws.service.WebService;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
try {
String path = System.getProperty("user.dir");
String axis2 = path+File.separator+"conf"+File.separator+"axis2.xml";
String repository = path+File.separator+"repository";
WebService webService = new WebService(repository,axis2);
webService.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
启动这个类这样webservice服务就启起来了,客户端就可以调了。所以你可以完全不用web容器来部署。
客户端的调用,这里就不多说了,把类直接贴出来吧
package com.webservice.ws;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.databinding.utils.BeanUtil;
import org.apache.axis2.engine.DefaultObjectSupplier;
import org.apache.axis2.rpc.client.RPCServiceClient;
import com.webservice.ws.model.User;
public class TestWs {
@SuppressWarnings("unchecked")
public void testWs_String() {
try {
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
EndpointReference targetEPR = new EndpointReference(
"http://localhost:8099/axis2/services/WebService
");
options.setTo(targetEPR);
QName getValue = new QName("http://service.ws.webservice.com
",
"getString
");
Object[] obj = {};
OMElement tt = serviceClient.invokeBlocking(getValue, obj);
Iterator elemetns = tt.getChildElements();
String str = new String();
while (elemetns.hasNext()) {
OMElement tmp = (OMElement) elemetns.next();
str = (String)
BeanUtil.processObject(tmp, String.class
, null,
true, new DefaultObjectSupplier());
}
System.out.println(str);
} catch (AxisFault e) {
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
public void testWs_bean() {
try {
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
EndpointReference targetEPR = new EndpointReference(
"http://localhost:8099/axis2/services/WebService");
options.setTo(targetEPR);
QName getValue = new QName("http://service.ws.webservice.com",
"getUser");
Object[