Upload
others
View
8
Download
0
Embed Size (px)
Citation preview
使用 XFire 与 Spring 开发 Web Service 1
使用 XFire 与 Spring
开发 Web Service
王啸 宇信易诚 [email protected]
目录
实现功能与特点 ....................................................................................................................... 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
使用 XFire 与 Spring 开发 Web Service 2
实现功能与特点
基于 J2EE 平台的 Web Service 服务
开发方便,配置简单
设计接口
实现服务
配置暴露接口
XFire 将自动生成对应的 wsdl
支持高级详细配置
与 Spring 无缝集成
运行环境
JDK 1.4+
Tomcat 4.0+ / WebLogic 8.1 (需要特殊配置,见附录)未测试其他环境
其他包依赖参看 http://xfire.codehaus.org/Dependency+Guide
开发平台
Eclipse WTP 1.5 平台 IDE:www.eclipse.org/webtools/
XFire 1.2.6 http://xfire.codehaus.org/Home
可以选择安装 XFire for Eclipse 插件,可以添加 XFire 相关类库,根据 WSDL 生成代
码。http://xfire.codehaus.org/Eclipse+Plugin
JDK 1.4.2 http://java.sun.com/products/archive/
Tomcat 5.0.28 http://tomcat.apache.org/download-55.cgi#5.0.28
实施步骤
概述
1. 建立一个 Java Project 用于 Domain 实体和 Web Service 接口,这个工程的输出是一
个 jar 包,为 Web Service 工程和 Web Service Client 共享。
2. 建立 WTP 动态 WEB 工程部署 Web Service
3. 建立 Java Project 使用 Web Service (Web Service Client)
使用 XFire 与 Spring 开发 Web Service 3
新建 Java Project
1. 建立普通 Java Project 以下称为 common 工程
2. 如果使用 Maven,项目依赖
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
3. 普通情况需要加入如下 lib
activation-1.1.jar
mail-1.4.jar
4. 编写类 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;
}
}
使用 XFire 与 Spring 开发 Web Service 4
5. 编写接口 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 工程
1. 配置 WTP 加入 Tomcat Server Runtime
a) 选择 Windows -> Preference
b) 在左侧选择 Server->Installed Runtime 添加 Tomcat
使用 XFire 与 Spring 开发 Web Service 5
2. 新建工程,选择 Dynamic Web Project 输入 Project Name: XFireService
3. 设置运行环境为 Dynamic Web Module 2.3 , JDK 1.4
4. 如果需要结合 Maven,请如下配置,否则使用默认即可
5. 如果使用 Maven 请注入如下依赖以及之前的 Common 工程,否则根据后面的列表
复制 lib 文件到对应目录
<dependency>
<groupId>org.codehaus.xfire</groupId>
<artifactId>xfire-aegis</artifactId>
<version>1.2.4</version>
</dependency>
使用 XFire 与 Spring 开发 Web Service 6
<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>
</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));
使用 XFire 与 Spring 开发 Web Service 7
return user;
}
}
利用 Spring、XFire 装配与暴露服务
1. 在 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>
2. 在 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>
测试并访问服务
1. 检查 lib文件夹,Maven用户注意添加对 common工程的依赖,其他情况请把 common
工程导出的 jar 包复制到 web-inf/lib 目录
使用 XFire 与 Spring 开发 Web Service 8
2. 在 WTP 中添加服务器,部署应用
3. 在浏览器中输入类似 http://localhost:8080/XFireService/service 应看到
4. 点击 wsdl http://localhost:8080/XFireService/service/UserService?wsdl 看到
如果这一步出现 500 错误,请检查是否有 xalan.jar 包
5. 在 WTP 中利用 Web Service Explore 测试 SOAP 方式,在 WTP 工具栏选择
最右侧按钮
6. 点击右上角进入 WSDL page
7. 点击 WSDL Main 节点输入服务 wsdl 地址,点击
使用 XFire 与 Spring 开发 Web Service 10
10. 点击结果中的 Source 可以看到 SOAP 报文
利用 XFire 实现客户端
1. 新建一个普通 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
2. 编写客户端程序
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");
使用 XFire 与 Spring 开发 Web Service 11
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();
}
}
}
3. 运行。控制台打印输出
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
1. 配置启用 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>
2. 在客户端编写传输程序
Service serviceModel = new ObjectServiceFactory()
.create(UserService.class);
UserService service = (UserService) new XFireProxyFactory().create(
serviceModel,
"http://localhost:8080/XFireService/service/UserService");
使用 XFire 与 Spring 开发 Web Service 12
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 中的配置
1. Add the QName JAR file (qname.jar) into the WEB-INF/lib folder in your WAR file
2. 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
参考
File Transfers using SOAP XFire
http://blogs.opensymphony.com/plightbo/2006/04/file_transfers_using_soap_xfir.html
XFire 生火指南
http://wiki.springside.org.cn/display/springside/XFire
XFire 官方网站
http://xfire.codehaus.org/Home
XFire On WebLogic 8.1
http://docs.codehaus.org/display/XFIRE/XFire+on+WebLogic+8.1