12
使用 XFire Spring 开发 Web Service 1 使用 XFire Spring 开发 Web Service 王啸 宇信易诚 [email protected] 目录 实现功能与特点 ....................................................................................................................... 2 运行环境 ................................................................................................................................... 2 开发平台 ................................................................................................................................... 2 实施步骤 ................................................................................................................................... 2 概述 ................................................................................................................................... 2 新建 Java Project ............................................................................................................... 3 新建 WTP 动态 WEB 工程................................................................................................ 4 实现服务 ........................................................................................................................... 6 利用 SpringXFire 装配与暴露服务............................................................................... 7 测试并访问服务 ............................................................................................................... 7 利用 XFire 实现客户端................................................................................................... 10 扩展主题 ................................................................................................................................. 11 利用 MTOM 传输二进制对象(文件)........................................................................ 11 附录 ......................................................................................................................................... 12 XFire WebLogic 8.1 中的配置 .................................................................................... 12 参考 ......................................................................................................................................... 12

开发 Web Service - read.pudn.comread.pudn.com/downloads92/ebook/358412/xfire-spring.pdf · 使用XFire 与Spring 开发Web Service 5 2. 新建工程,选择Dynamic Web Project

  • 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 9

8. 列出所有的可用服务,选择服务测试

9. 测试 queryUserByAccountId

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