使用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