前段時(shí)間,項(xiàng)目中使用了XFire開(kāi)發(fā)Webservice,現(xiàn)將開(kāi)發(fā)過(guò)程小結(jié)一下,以備后查。
一、配置web.xml,在Web應(yīng)用中增加X(jué)Fire的入口
注意XFire已有了自己的Servlet,不再依賴(lài)Spring MVC的DispatchServlet,也就遠(yuǎn)離了大家不熟悉的Spring MVC URL Mapping,與Spring達(dá)致完美的整合。
這里指定了路徑為/service/* ,即WebService的URL會(huì)被默認(rèn)生成為http://localhsot:8080/test/service/ServiceName,其中ServiceName默認(rèn)為下面的接口名。
<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文件:
<!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">
<!-- 傳統(tǒng)方式下XFire-Spring導(dǎo)出POJO為Web服務(wù)的配置文件-->
<!--引入XFire的預(yù)配置文件-->
<import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/>
<!--XFire WebService 基類(lèi)-->
<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>
<!-- 定義被導(dǎo)出的Web Service -->
<bean id="userService" parent="baseWebService">
<property name="serviceBean" ref="userServiceImpl"/>
<property name="serviceClass" value="com.test.services.UserService"/>
</bean>
</beans>
定義說(shuō)明:parent為前面定義的基類(lèi),serviceClass 為Web Service的接口,serviceBean為Web Service的接口實(shí)現(xiàn)類(lèi)。
當(dāng)然,在spring配置文件中定義userServiceImpl是必不可少的,如在serviceContext.xml中定義如下:
若不集成Spring,則需要定義一個(gè)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的名稱(chēng)
2、namespace 元素:表示該webService的命名空間
3、serviceClass 元素:表示該webService的接口
4、implementationClass 元素:表示該webService的實(shí)現(xiàn)類(lèi)
三、編寫(xiě)窄接口,抽取POJO中要導(dǎo)出的服務(wù)
從已有的UserManager.java中,抽取出一個(gè)窄接口,僅暴露需要導(dǎo)出為WebService的方法。注意UserManger.java是POJO,不需要任何WebService相關(guān)代碼。
窄接口一方面滿(mǎn)足了安全要求,不用整個(gè)UserManager所有方法導(dǎo)出為WebService;另一方面,XFire暫時(shí)也只支持基于接口的Proxy。
List<User> getUsers();
}
四、配置Java-XML Binding
如果返回類(lèi)型是List或Map,并且里面存放的是自定義類(lèi)的話(huà),則需要增加一個(gè)對(duì)于服務(wù)接口的配置文件。該文件的命名規(guī)則是 接口文件名.aegis.xml。例如接口是UserService.java的話(huà),則此配置文件命名為UserService.aegis.xml。注意此配置文件須與接口放在同一目錄下面。
<mappings>
<mapping >
<method name="getUsers">
<return-type componentType="com.test.domain.User"/>
</method>
</mapping>
</mappings>
如果返回的類(lèi)型是Map的話(huà),做法和List一樣。但定義的類(lèi)型,是Map中的Value部分,并且這樣的話(huà),Map中Value所存放的對(duì)象就必須全部是同一種類(lèi)啦。
參考資源:
http://wiki.springside.org.cn/display/springside/XFire
http://www.javaeye.com/topic/70005
http://junewolf.javaeye.com/blog/52523