摘要: XFire开发时,在返回数据类型时遇到了一些麻烦,查到这样一篇文单,非常不错,故收藏之。
翻译:
zilong3927
原文地址:
http://docs.codehaus.org/display/XFIRE/Mapping+collections
调用
Web Services
时,经常需要返回集合(
collection
)作为结果,或者接受
...
阅读全文
posted @
2007-04-20 18:36 josson 阅读(2443) |
评论 (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 阅读(3131) |
评论 (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 阅读(486) |
评论 (0) |
编辑 收藏
可能是人太懒的原故,而且文字表达能力也逊,所以很少写,原来在博客园的blog也很少更新。
今后要多写写blog,记录工作、学习中的问题和经验。也算是加强文档能力的一种途径吧!
有空也要把博客园的东西迁过来,毕竟那边是.net为主的。
posted @
2007-04-19 18:40 josson 阅读(185) |
评论 (0) |
编辑 收藏