前段时间,项目中使用了XFire开发Webservice,现将开发过程小结一下,以备后查。
一、配置web.xml,在Web应用中增加XFire的入口
注意XFire已有了自己的Servlet,不再依赖Spring MVC的DispatchServlet,也就远离了大家不熟悉的Spring MVC URL Mapping,与Spring达致完美的整合。
这里指定了路径为/service/* ,即WebService的URL会被默认生成为http://localhsot:8080/test/service/ServiceName,其中ServiceName默认为下面的接口名。
二、集成Spring
在spring能找到的config目录下,新建applicationContext-xfire.xml文件:
<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" >
< beans default-autowire ="byName" default-lazy-init ="true" >
<!-- 传统方式下XFire-Spring导出POJO为Web服务的配置文件 -->
<!-- 引入XFire的预配置文件 -->
< import resource ="classpath:org/codehaus/xfire/spring/xfire.xml" />
<!-- XFire WebService 基类 -->
< bean id ="baseWebService" class ="org.codehaus.xfire.spring.remoting.XFireExporter" lazy-init ="false"
abstract ="true" >
< property name ="serviceFactory" ref ="xfire.serviceFactory" />
< property name ="xfire" ref ="xfire" />
</ bean >
<!-- 定义被导出的Web Service -->
< bean id ="userService" parent ="baseWebService" >
< property name ="serviceBean" ref ="userServiceImpl" />
< property name ="serviceClass" value ="com.test.services.UserService" />
</ bean >
</ beans >
定义说明:parent为前面定义的基类,serviceClass 为Web Service的接口,serviceBean为Web Service的接口实现类。
当然,在spring配置文件中定义userServiceImpl是必不可少的,如在serviceContext.xml中定义如下:
若不集成Spring,则需要定义一个services.xml文件,存放在/src/META-INF/services.xml
< service >
< name > userService </ name >
< namespace > http://localhost:8080/service/userService </ namespace >
< serviceClass > com.test.service.UserService </ serviceClass >
< implementationClass > com.test.service.UserServiceImpl </ implementationClass >
</ service >
</ beans >
参数说明:
1、name 元素:表示该webService的名称
2、namespace 元素:表示该webService的命名空间
3、serviceClass 元素:表示该webService的接口
4、implementationClass 元素:表示该webService的实现类
三、编写窄接口,抽取POJO中要导出的服务
从已有的UserManager.java中,抽取出一个窄接口,仅暴露需要导出为WebService的方法。注意UserManger.java是POJO,不需要任何WebService相关代码。
窄接口一方面满足了安全要求,不用整个UserManager所有方法导出为WebService;另一方面,XFire暂时也只支持基于接口的Proxy。
List < User > getUsers();
}
四、配置Java-XML Binding
如果返回类型是List或Map,并且里面存放的是自定义类的话,则需要增加一个对于服务接口的配置文件。该文件的命名规则是 接口文件名.aegis.xml。例如接口是UserService.java的话,则此配置文件命名为UserService.aegis.xml。注意此配置文件须与接口放在同一目录下面。
< mappings >
< mapping >
< method name ="getUsers" >
< return-type componentType ="com.test.domain.User" />
</ method >
</ mapping >
</ mappings >
getUsers方法返回类型是List,里面装的User对象。对于这种类型的方法,在配置文件中描述了它的返回值类型。
如果返回的类型是Map的话,做法和List一样。但定义的类型,是Map中的Value部分,并且这样的话,Map中Value所存放的对象就必须全部是同一种类啦。
参考资源:
http://wiki.springside.org.cn/display/springside/XFire
http://www.javaeye.com/topic/70005
http://junewolf.javaeye.com/blog/52523
< servlet-name > xfire </ servlet-name >
< servlet-class > org.codehaus.xfire.spring.XFireSpringServlet </ servlet-class >
</ servlet >
< servlet-mapping >
< servlet-name > xfire </ servlet-name >
< url-pattern > /service/* </ url-pattern >
</ servlet-mapping >