以前就开始看过一些XFire的资料,但是每一次都是按照书写的例子才能写出一些基本的例子,根本不理解,目前又做了一种发布webservice的方式 通过继承XFireServlet的方式,这种方式的好处就是简单 不需要配置services.xml文件
UserManagerImpl
public class UserManagerImpl implements UserManager {
public List findAllUser() {
List list = new ArrayList();
for(int i = 1 ; i <= 3 ; i ++) {
User user = new User();
user.setId(i);
user.setName("user" + i);
list.add(user);
}
return list;
}
}
最简单的两个方法
注意一下super.init(),是必须加的,因为XFire核心的 Http Transprot是通过 XFireServletController实现的,我们可以来看下XFireServlet的init()方法里面都干了什么
如果没有init()就会报空指针错误,当然这个错误很明显 会提示你XFireServletController为空,我只是在这里说明下,因为小弟水平太次了,就犯了这个错误,一看空指针也没有看详细信息就以为失败了,真是太2了。
再配置下web.xml把我们的servlet配置进去:
好了启动服务访问下:
http://127.0.0.1:8080/webservice/soap/UserManager?wsdl
呵呵,估计又报错了,说类型不能识别,使用jdk1.5以上的朋友可以加上泛型把上面的List 都改成List<User>再跑就行了,但是很多情况下又得去支持jdk1.4那么我们就必须在接口的目录下添加一个xxx.aegis.xml文件了:
这里就是UserManager.aegis.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<mappings>
<mapping>
<method name="findAllUser">
<return-type componentType="com.soap.User"/>
</method>
</mapping>
</mappings>
相信大家一看就知道这个文件的意思了,但是为了帮助跟我一样的菜鸟 我稍微解释下这个文件的意思:
第一行不用说,xml的固定写法:
<mappings>下的mapping映射的<method>就是我们接口中的方法,为什么要这个配置文件呢,因为XFire只支持八种基本类型,有时候我都忘了八种基本类型有char和short了(char byte short int long double float boolean 呵呵 这里补充下,真是太菜了,要不说出去都丢人了),好了 也就是说不是这八种类型 不管是参数 和 返回值 XFire都不知道,就需要我们手动配置了
<method name="findAllUser"> //name属性 方法名为findAllUser
//如果你的方法里面有参数也不是这八种基本类型 比如有个参数是 User user ,String str
//配置
<parameter index="0" keyType="com.soap.User" componentType="com.soap.User" mappedName="user"/> //名称就知道了 我就 不解释了
<parameter index="1" keyType="java.lang.String" componentType="java.lang.String" mappedName="str"/>
<return-type componentType="com.soap.User"/> //返回类型的List中封装的是什么 看来泛型真是个好东西,可惜为了兼容1.4只能忍了
</method>
好了不使用泛型的方式也行了 部署测试下。
可能还有需求我不想用web方式 用j2se方式 能发布xfire吗,答案是肯定的,XFire为我们提供了一个XFireHttpServer ,在上面那个基础上我写了一个文件:
public class ServiceStarter {
XFireHttpServer server;
public void start() throws Exception {
//创建service
ObjectServiceFactory serviceFactory = new ObjectServiceFactory();
Service endpoint = serviceFactory.create(UserManager.class);
Service endpoint1 = serviceFactory.create(WebserviceInterface.class);
endpoint.setInvoker(new BeanInvoker(new UserManagerImpl()));
endpoint1.setInvoker(new BeanInvoker(new Webservicehandler()));
//我这里注册了两个服务 就是为了验证下看能否注册多个接口 上面XFire的例子也是一样的
//这里就必须手动建立xfire了
XFire xfire = XFireFactory.newInstance().getXFire();
xfire.getServiceRegistry().register(endpoint);
xfire.getServiceRegistry().register(endpoint1);
//建立对象
server = new XFireHttpServer();
//设置监听端口
server.setPort(8081);
//开启服务
server.start();
}
public void stop() throws Exception {
server.stop();
}
public static void main(String[] args) {
ServiceStarter starter = new ServiceStarter();
try {
starter.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
这里写的很简单,直接运行下这个方法 然后访问:
http://127.0.0.1:8081/UserManager?wsdl 这种情况估计不常见 知道下就可以了
还有配置service.xml方式的例子 我就不介绍了,那种例子别人给的太多了 。。。。