posts - 122,  comments - 25,  trackbacks - 0

前段时间,项目中使用了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默认为下面的接口名。

    <servlet> 
        
<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>

二、集成Spring

在spring能找到的config目录下,新建applicationContext-xfire.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!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中定义如下:

<bean id="userServiceImpl" class="com.test.services.UserServiceImpl"/>

若不集成Spring,则需要定义一个services.xml文件,存放在/src/META-INF/services.xml

 <beans  xmlns="http://xfire.codehaus.org/config/1.0">  
   
<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。

public interface UserService {
   List
<User> getUsers();
}


四、配置Java-XML Binding
如果返回类型是List或Map,并且里面存放的是自定义类的话,则需要增加一个对于服务接口的配置文件。该文件的命名规则是 接口文件名.aegis.xml。例如接口是UserService.java的话,则此配置文件命名为UserService.aegis.xml。注意此配置文件须与接口放在同一目录下面。
 <?xml version="1.0" encoding="UTF-8"?>  
 
<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
posted on 2007-04-20 18:22 josson 阅读(3012) 评论(1)  编辑  收藏 所属分类: java 开发


FeedBack:
# re: XFire 开发小结.
2007-07-20 13:28 | josson
XFire without spring.
http://xfire.codehaus.org/Quick+Start

引用包另需要spring.jar及xbean-spring.jar, 注:spring2.0会有问题,services.xml文件解析会出现问题。spring1.2.6版本可以解决这一问题。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用链接

留言簿(3)

随笔分类

随笔档案

收藏夹

搜索

  •  

最新评论

阅读排行榜

评论排行榜