使用XFire與Spring開發Web Service
源代碼下載(三個樣例工程Maven版本) xfire-src.zip
相關lib文件請到XFire官方網站(見參考) 下載發布版本。
PDF版本下載
目錄
實現功能與特點 2
運行環境 2
開發平臺 2
實施步驟 2
概述 2
新建Java Project 3
新建WTP動態WEB工程 4
實現服務 6
利用Spring、XFire裝配與暴露服務 7
測試并訪問服務 7
利用XFire實現客戶端 10
擴展主題 11
利用MTOM傳輸二進制對象(文件) 11
附錄 12
XFire在WebLogic 8.1中的配置 12
參考 12
實現功能與特點
- 基于J2EE平臺的Web Service服務
- 開發方便,配置簡單
- 設計接口
- 實現服務
- 配置暴露接口
- XFire將自動生成對應的wsdl
- 支持高級詳細配置
- 與Spring無縫集成
運行環境
開發平臺
實施步驟
概述
- 建立一個Java Project用于Domain實體和Web Service接口,這個工程的輸出是一個jar包,為Web Service工程和Web Service Client共享。
- 建立WTP動態WEB工程部署Web Service
- 建立Java Project使用Web Service (Web Service Client)
新建Java Project
- 建立普通Java Project 以下稱為common工程
- 如果使用Maven,項目依賴
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
- 普通情況需要加入如下lib
activation-1.1.jar
mail-1.4.jar
- 編寫類 org.ave7.xfire.domain.User
org.ave7.xfire.domain.User.java
package org.ave7.xfire.domain;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private static final long serialVersionUID = 6517808321041980976L;
private Long userId;
private String accountId;
private String userName;
private Date lastLogin;
public String getAccountId() {
return accountId;
}
public void setAccountId(String accountId) {
this.accountId = accountId;
}
public Date getLastLogin() {
return lastLogin;
}
public void setLastLogin(Date lastLogin) {
this.lastLogin = lastLogin;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
- 編寫接口 org.ave7.xfire.ws.UserService
org.ave7.xfire.ws.UserService.java
package org.ave7.xfire.ws;
import org.ave7.xfire.domain.User;
public
interface UserService {
public User queryUserByAccoutId(String accountId);
public
void createUser(User user);
}
新建WTP動態WEB工程
- 配置WTP加入Tomcat Server Runtime
- 選擇Windows -> Preference
- 在左側選擇Server->Installed Runtime 添加Tomcat

- 新建工程,選擇Dynamic Web Project 輸入Project Name: XFireService

- 設置運行環境為Dynamic Web Module 2.3 , JDK 1.4

- 如果需要結合Maven,請如下配置,否則使用默認即可

- 如果使用Maven請注入如下依賴以及之前的Common工程,否則根據后面的列表復制lib文件到對應目錄
<dependency>
<groupId>org.codehaus.xfire</groupId>
<artifactId>xfire-aegis</artifactId>
<version>1.2.4</version>
</dependency>
<dependency>
<groupId>org.codehaus.xfire</groupId>
<artifactId>xfire-spring</artifactId>
<version>1.2.4</version>
<dependency>
<groupId>xalan</groupId>
<artifactId>xalan</artifactId>
<version>2.7.0</version>
</dependency>
Lib文件列表
xbean-2.2.0.jar
qdox-1.5.jar
commons-attributes-api-2.1.jar
ant-1.5.jar
wstx-asl-3.2.0.jar
stax-utils-20040917.jar
commons-httpclient-3.0.jar
spring-1.2.6.jar
XmlSchema-1.1.jar
stax-api-1.0.1.jar
jaxen-1.1-beta-9.jar
xfire-annotations-1.2.4.jar
xfire-aegis-1.2.4.jar
xfire-core-1.2.4.jar
xfire-spring-1.2.4.jar
xfire-xmlbeans-1.2.4.jar
jdom-1.0.jar
xbean-spring-2.7.jar
wsdl4j-1.6.1.jar
commons-beanutils-1.7.0.jar
activation-1.1.jar
mail-1.4.jar
commons-codec-1.3.jar
xmlParserAPIs-2.6.2.jar
xercesImpl-2.6.2.jar
junit-3.8.1.jar
commons-logging-1.0.4.jar
xalan-2.7.0.jar
實現服務
org.ave7.xfire.ws.UserServiceImpl.java
package org.ave7.xfire.ws;
import java.rmi.RemoteException;
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.ave7.xfire.domain.User;
public
class UserServiceImpl implements UserService {
private
static
final Log log = LogFactory.getLog(UserServiceImpl.class);
public
void createUser(User user) throws RemoteException {
log.debug(“createUser user=” + user);
}
public User queryUserByAccoutId(String accountId) throws
RemoteException {
log.debug(“accountId=” + accountId);
User user = new User();
user.setAccountId(“testAccount”);
user.setLastLogin(new Date());
user.setUserName(“測試用戶“);
user.setUserId(new Long(123L));
return user;
}
}
利用Spring、XFire裝配與暴露服務
- 在web.xml配置相關組件
<?xml version=“1.0″ encoding=“UTF-8″?>
<!DOCTYPE web-app PUBLIC “-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN”
“http://java.sun.com/dtd/web-app_2_3.dtd”>
<web-app id=“WebApp_ID”>
<display-name>XFireService</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<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>
</web-app>
- 在applicationContext.xml配置相關服務
<?xml version=“1.0″ encoding=“UTF-8″?>
<!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN”
“http://www.springframework.org/dtd/spring-beans.dtd”>
<beans>
<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>
<bean id=“userWS” class=“org.ave7.xfire.ws.UserServiceImpl”></bean>
<bean id=“userService” parent=“baseWebService”>
<property name=“serviceBean” ref=“userWS” />
<property name=“serviceClass”
value=“org.ave7.xfire.ws.UserService” />
</bean>
</beans>
測試并訪問服務
- 檢查lib文件夾,Maven用戶注意添加對common工程的依賴,其他情況請把common工程導出的jar包復制到web-inf/lib目錄
- 在WTP中添加服務器,部署應用

- 在瀏覽器中輸入類似 http://localhost:8080/XFireService/service 應看到

- 點擊wsdl http://localhost:8080/XFireService/service/UserService?wsdl 看到

如果這一步出現500錯誤,請檢查是否有xalan.jar包
- 在WTP中利用Web Service Explore測試SOAP方式,在WTP工具欄選擇
最右側按鈕
- 點擊右上角進入WSDL page

- 點擊WSDL Main節點輸入服務wsdl地址,點擊

- 列出所有的可用服務,選擇服務測試

- 測試queryUserByAccountId

- 點擊結果中的Source可以看到SOAP報文

利用XFire實現客戶端
- 新建一個普通Java工程,lib中引用XFire相關包
如果使用Maven添加如下依賴以及對common工程的引用
<dependency>
<groupId>org.codehaus.xfire</groupId>
<artifactId>xfire-aegis</artifactId>
<version>1.2.4</version>
</dependency>
普通Java工程添加如下lib以及對common工程的引用
activation-1.1.jar
commons-codec-1.3.jar
commons-httpclient-3.0.jar
commons-logging-1.0.4.jar
jaxen-1.1-beta-9.jar
jdom-1.0.jar
junit-3.8.1.jar
mail-1.4.jar
stax-api-1.0.1.jar
stax-utils-20040917.jar
wsdl4j-1.6.1.jar
wstx-asl-3.2.0.jar
xercesImpl-2.6.2.jar
xfire-aegis-1.2.4.jar
xfire-core-1.2.4.jar
xmlParserAPIs-2.6.2.jar
XmlSchema-1.1.jar
- 編寫客戶端程序
org.ave7.xfire.client.MyClient.java
package org.ave7.xfire.client;
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import org.ave7.xfire.domain.User;
import org.ave7.xfire.ws.UserService;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
public
class MyClient {
public
static
void main(String[] args) {
try {
Service serviceModel = new ObjectServiceFactory()
.create(UserService.class);
UserService service = (UserService) new XFireProxyFactory().create(
serviceModel,
“http://localhost:8080/XFireService/service/UserService”);
User user = service.queryUserByAccoutId(“123″);
System.out
.println(“userId=” + user.getUserId() + “, userName=”
+ user.getUserName() + “, lastLogin=”
+ user.getLastLogin());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
- 運行。控制臺打印輸出
2007-8-16 10:25:52 org.codehaus.xfire.aegis.type.DefaultTypeMappingRegistry crea
teTypeCreator
信息: Couldn’t find Java 5 module on classpath. Annotation mappings will not be su
pported.
userId=123, userName=測試用戶, lastLogin=Thu Aug 16 10:25:53 CST 2007
擴展主題
利用MTOM傳輸二進制對象(文件)
MTOM是XFire的一個組件,可以協助利用壓縮等手段更快的在網絡上傳輸base64的SOAP對象
MTOM以及aegis默認支持如下幾種java對象的數據
- byte[]
- javax.activation.DataHandler
- javax.activation.DataSource
- 配置啟用MTOM
在Spring配置文件中需要MTOM的服務中加入如下配置
<bean id=“userService” parent=“baseWebService”>
<property name=“serviceBean” ref=“userWS” />
<property name=“serviceClass”
value=“org.ave7.xfire.ws.UserService” />
<property name=”properties”>
<map>
<entry key=”mtom-enabled” value=”true” />
</map>
</property>
</bean>
- 在客戶端編寫傳輸程序
Service serviceModel = new ObjectServiceFactory()
.create(UserService.class);
UserService service = (UserService) new XFireProxyFactory().create(
serviceModel,
“http://localhost:8080/XFireService/service/UserService”);
Client client = Client.getInstance(service);
client.setProperty(“mtom-enabled”, “true”);
client.setProperty(HttpTransport.CHUNKING_ENABLED, “true”);
User user = service.queryUserByAccoutId(“123″);
System.out
.println(“userId=” + user.getUserId() + “, userName=”
+ user.getUserName() + “, lastLogin=”
+ user.getLastLogin());
ByteArrayDataSource byteData = new ByteArrayDataSource(
“Test Sending Byte”.getBytes(), “text/plain; charset=UTF-8″);
service.transferDataSource(byteData);
附錄
XFire在WebLogic 8.1中的配置
- Add the QName JAR file (qname.jar) into the WEB-INF/lib folder in your WAR file
- Add a file weblogic.xml into the WEB-INF folder in your WAR file
<!DOCTYPE weblogic-web-app PUBLIC
“-//BEA Systems, Inc.//DTD Web Application 8.1//EN”
“http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd”>
<weblogic-web-app>
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
</weblogic-web-app>
QName JAR file (qname.jar) http://docs.codehaus.org/download/attachments/27836/qname.jar?version=1
參考
XFire On WebLogic 8.1
http://docs.codehaus.org/display/XFIRE/XFire+on+WebLogic+8.1