在Spring中使用XFire构建Web Service应用

来源:百度文库 编辑:神马文学网 时间:2024/04/28 11:56:32
概述
XFire是与Axis 2并列的新一代Web Service框架,通过提供简单的API支持Web Service各项标准协议,帮助你方便快速地开发Web Service应用。XFixe内建在STAX的基础上之上,STAX是基于流的XML解析引擎,这使得XFire拥有很高的性能。
相对Axis来说,目前它的人气指数相当高,加上其提供了和String集成的支持,在目前的Web Service开源社区拥有众多的追随者,XFire被多个开源项目所使用。XFire为Spring提供了支持,这使得我们可以很容易在Spring中使用XFire构建Web Service应用。本文讲述了如何使用XFire在Spring中开发Web Service的具体过程。
XFire特性
XFire是Web Service框架的后起之秀,它从现有的框架中借鉴了许多优秀的理念,力争将Web Service的应用开发难度降到最低。此外,还提供了各种绑定技术、支持多种传输协议,对Web Service体系中许多新的规范提供了支持。简单来说,它具有以下一些特性:
支持重要的Web Service规范,如SOAP、WSDL、WS-I Basic Profile,、WS-Addressing、WS-Security等; 高性能的SOAP 栈设计; 可插拔的绑定,支持POJO、XMLBeans、JAXB1.1、JAXB2以及Castor; 支持JSR 181规范,该规范通过JDK 5.0注解将POJO导出为Web Service; 支持多种传输协议:HTTP、JMS、XMPP、In-JVM等,其中In-JVM允许我们在不启动Web应用器的情况下,象一般的程序一样测试Web Service应用; 易用的API,XFire API简洁明了,便于使用; 支持Spring、Pico、Plexus、Loom等容器; 支持JBI(Java Business Integration:Java 业务整合)规范,JBI是JSR 208的实现; 能够根据WSDL创建客户端和服务器端的存根代码; 率先对JAX-WS提供了支持,JAX-WS是JAX-RPC的替代者。
XFire 体系及重要API
ServiceFactory
ServiceFactory是XFire的核心类,它可以将一个POJO生成为一个Web Service。让我们通过一个最简单的例子了解ServiceFactory的用途,假设我们在一个POJO中定义了一个业务,现在希望将其导出为Web Service,通过ServiceFactory可以轻而易举地达到目的:
XFire xfire = XFireFactory.newInstance().getXFire();
ServiceFactory factory = new ObjectServiceFactory(xfire.getTransportManager(), null);
Service service = factory.create(YourService.class);
这样我们就为YourService类创建基于SOAP 1.1封装的Web Service。Service的输入输出参数如果为简单类型的对象(由String、int、long等基本类型组成),无须进行额外的映射设置,对于复杂类型的输入输出Service,XFire将会自动尝试将其序列化(通过Aegis绑定)。紧接着,你就可以注册这个Service。
xfire.getServiceRegistry().register(service);
XFire推荐通过一个接口开放服务,此时,你可以指定一个具体的实现类:
service.setProperty(ObjectInvoker.SERVICE_IMPL_CLASS, YourServiceImpl.class);
Handler
一个Handler可以看成是XFire的一个加工套件,XFire通过它们定义SOAP发送和接收之前的各种加工处理逻辑。如Handler可以对SOAP体的内容进行加工处理,或者SOAP头进行处理。可以简单地通过扩展AbstractHandler定义一个自己的Handler类:
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.handler.AbstractHandler;
public class YourHandler extends AbstractHandler
{
public void invoke(MessageContext context)
{
// Do Sth...
}
}
Handler可以注册到Service或Transport(代表SOAP输入输出的的传输对象)中,在服务请求和响应管道里,Service和Transport注册的Handler将执行额外的处理操作。你可以按如下方式注册Handler:

Servic s = factory.create(YourService.class);
s.addInHandler(new YourHandler1());①添加一个Handler,对输入SOAP进行处理
s.addOutHandler(new YourHandler2());②添加一个Handler,对输出SOAP进行处理
s.addFaultHandler(new YourHandler3());③添加一个Handler,对错误SOAP进行处理

下面的Handler对SOAP头进行处理,添加一些特定的信息:
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.handler.AbstractHandler;
public class YourHandler extends AbstractHandler
{

public QName[] getUnderstoodHeaders()
{
return new QName[] { new QName("YourHeader", "urn:your:header:ns") };
}
}