posts - 122,  comments - 25,  trackbacks - 0
     摘要: XFire开发时,在返回数据类型时遇到了一些麻烦,查到这样一篇文单,非常不错,故收藏之。 翻译: zilong3927  原文地址: http://docs.codehaus.org/display/XFIRE/Mapping+collections 调用 Web Services 时,经常需要返回集合( collection )作为结果,或者接受 ...  阅读全文
posted @ 2007-04-20 18:36 josson 阅读(2431) | 评论 (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 @ 2007-04-20 18:22 josson 阅读(3117) | 评论 (1)编辑 收藏
这两天,项目中需要开发一些webservice接口,我选用了XFire框架,原来一直在用AXIS。

很多朋友都在讨论XFire和AXIS的优劣,就我而言,更喜欢XFire,至少目前是如此。

最讨厌axis要生成一段东西,才能在wsdd文件注册服务,很是麻烦。而且,调试时要是设成debug,那可就惨了,一大堆用户信息,出了异常还不好捕捉。相比之下,XFire的开发就要简单的点多了,包括代码开发,配置,还是返回自定义类型,真是easy。不过,客户端调用时(动态模式或根据WSDL生成Client Stub),返回的自定义类型是否能顺利取得,到时需要研究一下。

今天,就返回类型问题困了好久,还好已经解决了。

对象的属性、函数的参数和返回值如果为int、String、Date等普通类型以及由普通类型组成的复杂对象都无需定义。我见到只有两种情况需要定义:

  • 无法使用泛型定义Collection中元素的类型时。
  • 需要为属性定义不同的名字,或者定义复杂对象里的某些属性不要输出。
若是遇害到上述情况的话,需要进行aegis配置,文件名应与接口的文件名相同,并且放在同一目录下,如UserService.java,则定义一下UserService.aegis.xml文件,定义内容如下:
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <mappings>
 3     <mapping>
 4         <method name="getResources">
               <
!--配置getResources服务的返回值,List内对象为Resource-->
 5             <return-type componentType="com.test.Resource" />
 6         </method>
 7         
 8         <method name="getAuthentication">
 9             <return-type componentType="com.test.Authentication" />
10         </method>
11     </mapping>
12 </mappings>

若返回的Javabeans存在Collections 时,需要定义一个与javabean相关的文件名,如User.aegis.xml,并且放在相同的目录下:
<?xml version="1.0" encoding="UTF-8"?>
<mappings>
    
<mapping>
        
<!--User bean  ,包含了一个  List  ,  其中的对象是Resource  -->
        
<property name="resources" componentType="com.test.Resource" />
        
<!--配置User类,忽略内嵌的roles属性不要输出XML-->
        
<property name="roles" ignore="true" />
    
</mapping>
</mappings>


有空将XFire使用总结一下,也贴出来。

posted @ 2007-04-19 19:13 josson 阅读(470) | 评论 (0)编辑 收藏
可能是人太懒的原故,而且文字表达能力也逊,所以很少写,原来在博客园的blog也很少更新。

今后要多写写blog,记录工作、学习中的问题和经验。也算是加强文档能力的一种途径吧!

有空也要把博客园的东西迁过来,毕竟那边是.net为主的。

posted @ 2007-04-19 18:40 josson 阅读(172) | 评论 (0)编辑 收藏
仅列出标题
共11页: First 上一页 3 4 5 6 7 8 9 10 11 
<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(3)

随笔分类

随笔档案

收藏夹

搜索

  •  

最新评论

阅读排行榜

评论排行榜