Apache CXF快速上手教程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Apache CXF快速上手教程
基础架构
CXF旨在为服务创建必要的基础设施,它的整体架构主要由以下几个部分组成:
1.Bus
它是C X F架构的主干,为共享资源提供了一个可配置的场所,作用非常类似于S p r i n g 的ApplicationContext。这些共享资源包括WSDL管理器、绑定工厂等。通过对Bus进行扩展,可以方便地容纳自己的资源,或替换现有的资源。默认Bus实现是基于Spring的,通过依赖注入,将运行时组件串起来。Bus的创建由BusFactory负责,默认是SpringBusFactory,对应于默认Bus实现。在构造过程中,SpringBusFactory会搜索META-INF/cxf(就包含在CXF 的Jar中)下的所有Bean配置文件,根据它们构建一个ApplicationContext。开发者也可提供自己的配置文件来定制Bus。
2.消息传递和拦截器(Interceptor)
CXF建立于一个通用的消息层之上,主要由消息、拦截器和拦截器链(InterceptorChain)组成。CXF是以消息处理为中心的,熟悉JSP/Servlet的开发者可以将拦截器视为CXF架构中的“Filter”,拦截器链也与“FilterChain”类似。通过拦截器,开发者可以方便地在消息传递、处理的整个过程中对CXF进行扩展。拦截器的方法主要有两个:handleMessage和handleFault,分别对应消息处理和错误处理。在开发拦截器的时候需要注意两点:
拦截器不是线程安全的,不建议在拦截器中定义实例变量并使用它。这一点跟JSP/Servlet 中对于Filter的处理是一样的;
不要调用下一个拦截器的handleMessage或handleFault,这个工作由InterceptorChain来完成。
3.前端(Front End)
它为CXF提供了创建服务的编程模型,当前主要的前端就是JAX-WS。
4.服务模型
CXF中的服务通过服务模型来表示。它主要有两部分:ServiceInfo和服务本身。ServiceInfo 作用类似WSDL,包含接口信息、绑定、端点(EndPoint)等信息;服务则包含了ServiceInfo、数据绑定、拦截器和服务属性等信息。可使用Java类和WSDL来创建服务。一般是由前端负责服务的创建,它通过ServiceFactory来完成。
5.绑定(Binding)
绑定提供了在传输之上映射具体格式和协议的方法,主要的两个类是Binding和BindingFactory。BindingFactory负责创建Binding。
6.传输(Transport)
为了向绑定和前端屏蔽传输细节,CXF提供了自己的传输抽象。其中主要有两个对象:Conduit和Destination。前者是消息发送的基础,后者则对应消息接收。开发者还可以给Conduit和Destination注册MessageObserver,以便在消息发送和接收时获得通知。
开发方法
CXF可以创建的Web服务应用有两种:服务提供者和服务消费者。这种结构可类比客户端/服务器结构,服务消费者类似于客户端,服务提供者类似于服务器。使用CXF创建应用时,服务提供者和服务消费者并不需要同时出现,因为有可能应用只是作为服务提供者或服务消费者单独出现。
为了说明使用CXF如何创建这两种类型的应用,本教程将同时给出它们的例子。另外,由于Groovy在Java世界中变得越来越流行,本教程会给出使用Groovy的CXF插件GroovyWS的实现例子。例子使用JDK1.5.X和Groovy1.0完成,包含以下几部分:
er,用户对象,在消费者和提供者之间传递;
erService,用户管理服务,它提供增加和获取所有用户的功能;
3.Client,服务消费者,它向UserService发起服务请求。
Java实现的步骤包括以下几点。
服务端包含UserService、UserServiceImpl和User。其中,UserService是接口定义,UserServiceImpl是它的实现,并负责服务的发布,服务只有发布之后才能被消费。例子使用了JAX-WS,它们的主要内容如下:
UserService
package server;import javax.jws.WebService;@WebServicepublic interface UserService{void add(User user);User[]findAllUsers();}
@WebService指明接口是Web服务
UserServiceImpl
import java.util.List;import java.util.Vector;import
javax.jws.WebService;import
javax.xml.ws.Endpoint;@WebService(endpointInterface=
"erService",serviceName=
"UserService",portName="UserServicePort")public class UserServiceImpl implements UserService{static List
Vector
{UserRepository.add(user);}public User[]findAllUsers(){User[]users=new User[UserRepository.size()];UserRepository.toArray(users);return
users;}public static void main(String[]args){UserServiceImpl userService= new
UserServiceImpl();Endpoint.publish("http://localhost:9000/userService", userService);}}
@WebService中的serviceName、portName,分别指定了其产生的WSDL中的服务名和端口名。endpointInterface为接口的类名。服务发布代码也可以放在另一个类中。
User
package server;public class User{String first;String last;public String
getFirst(){return first;}public void setFirst(String first){this.first=first;}public String getLast(){return last;}public void setLast(String last){st=last;}} 2.客户端只有一个类:Client,其他的User、UserService引用server包中的对象。