本文來自SpringSide WIki,請留意Wiki上的最新版本。
基于發布在JavaEye的敬畏心情,本文又修改了一遍,與前兩天發在blogjava和csdn的版本稍有不同。
1. 概述
XFire
是全球眾多牛人在與axis系列對比后一致投票的選擇。我比較欣賞的特性有:
- 與Spring整合
,無須生成一堆文件,無須打包獨立war,直接將應用中的Pojo導出為Web服務。
- Aegis
--超簡約的默認Java XML 綁定機制,且可以Plugin其他綁定機制。
- JSR181--annotatiton驅動
的POJO WebService配置。
- 基于Stax的高性能框架
。
- 脫離Web服務器的單元測試能力。
網上的文檔與例子總是不新,請大家拋開所有的文檔,所有的Axis習慣,單看這份代表XFire1.2.2最簡約做法的指南。
2. 生火指南
2.1 修改web.xml,在Web應用中增加XFire的入口
注意XFire有了自己的Servlet,不再依賴Spring MVC的DispatchServlet,也就遠離了大家不熟悉的Spring MVC URL Mapping,與Spring達致完美的整合。
這里指定了路徑為/service/* ,即WebService的URL會被默認生成為http://www.xxx.com/yyy/service/BookServiceservice/ServiceName
,其中ServiceName默認為下文中的接口名。
xml 代碼
- <servlet>
- <servlet-name>xfireservlet-name>
- <servlet-class>org.codehaus.xfire.spring.XFireSpringServletservlet-class>
- servlet>
- <servlet-mapping>
- <servlet-name>xfireservlet-name>
- <url-pattern>/service/*url-pattern>
- servlet-mapping>
如果應用使用了Hibernate,使用了OpenSessionInView Filter,注意配置OSIV Filter Filter覆蓋xfire servlet的路徑,即本例中的/service/*.
2.2 編寫窄接口,抽取POJO中要導出的服務
從已有的BookManager.java中,抽取出一個窄接口,僅暴露需要導出為Web Service的方法。而BookManger.java是POJO,不需要任何WebService相關代碼。
窄接口一方面滿足了安全要求,不用整個BookManager所有方法導出為Web Service;另一方面,XFire暫時也只支持基于接口的Proxy。
public interface BookService {
List findBooksByCategory(String cateoryId);
}
2.3 配置Java-XML Binding
XFire默認的Aegis Binding語法非常簡單,在SpringSide的例子里幾乎一行配置都不用寫,是我見過最簡單的binding定義,大大優于其他以設計復雜為終極目標的方案。
對象的屬性、函數的參數和返回值如果為int、String、Date等普通類型以及由普通類型組成的復雜對象都無需定義。我見到只有兩種情況需要定義:
- 無法使用泛型定義Collection中元素的類型時--如List findBooks()。如果能寫成List findBooks()就也不需要了。
- 需要為屬性定義不同的名字,或者定義復雜對象里的某些屬性不要輸出。
如果實在需要aegis配置, XFire以約定俗成代替配置(CoC),所有Service和Entity Bean的binding文件要求命名為xxx.aegis.xml,而且要和原來的類sit together在同一目錄里。
- <mapping>
-
- <property name="products" ignore="true"/>
- mapping>
其他語法詳見Aegis
參考。
2.4 配置Spring導出
為了節約配置代碼,先配置一個基類。注意導出Web服務的Bean不能lazy-init:
<import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/>
<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服務的定義:parent為前面定義的基類,serviceClass 為Web Service的接口,serviceBean為Web Service的接口實現類。
xml 代碼
- <bean id="bookService" parent="baseWebService">
- <property name="serviceBean" ref="bookManager"/>
- <property name="serviceClass" value="org.springside.bookstore.components.xfire.server.simple.BookService"/>
- bean>
Web服務導出完畢,用戶可在http://localhost/service/BookService?WSDL
查看自動生成的WSDL。
上半章完,關于JSR181,Client API與測試部分請看XFire 生火指南(下)