使用 Spring 和 Apache CXF 设计和实现 POJO Web 服务,第 1 部分: 使用 CXF 和 Spring 创建 Web 服务

使用开放源代码 Web 服务框架 Apache CXF 可以很容易地创建传统 Java™ 对象(plain old Java object ,POJO)样式的 Web 服务。本文是本系列的第 1 部分,将向您介绍如何使用 Spring 和 CXF 将 POJO 作为 Web 服务公开。本文还将演示 CXF 与 Spring 框架的集成。

Rajeev Hathi, 高级软件顾问

http://www.ibm.com/developerworks/i/p-rhathi.jpgRajeev Hathi 是一名 J2EE 平台软件顾问。他的主要兴趣包括基于 J2EE 的应用程序的体系结构确定和设计工作。Rajeev 获得了 SUN 的 Java 和 J2EE 技术认证(Web、EJB、Architect)。他向 IBM developerWorks 投过稿,编写过有关 Ajax、Web 服务、DB2 和 XML 的文章。此外,他还参与编写过一本有关动手将 Java 6 应用于 Web 服务的图书。他定居在印度的孟买。他在业余时间喜欢观看体育赛事和欣赏摇滚音乐。


developerWorks 投稿作者

Naveen Balani, 软件架构师, IBM

http://www.ibm.com/developerworks/i/p-nbalani.jpgNaveen Balani 担任 IBM India Software Labs (ISL) 的架构师。他在 ISL 领导 WebSphere Business Services Fabric 的设计和开发活动。他喜欢研究新技术,并且是 IBM developerWorks 的固定投稿人,撰写过关于 Web 服务、ESB、JMS、SOA、体系结构、开放源代码框架、语义 Web、J2ME、普及计算、Spring、Ajax 和各种 IBM 产品的大量文章。他还是图书 Beginning Spring Framework 2Getting Started with IBM WebSphere Business Services Fabric V6.1 的合著者。


developerWorks 3 星大师作者

2008 年 9 月 18 日

引言

在本文中,您将使用 CXF 和 Spring 来构建和开发一个订单处理 Web 服务。该 Web 服务处理或验证客户所下的订单,并返回唯一的订单 ID。阅读本文之后,您将能够应用 CXF 的概念和功能来构建和开发 Web 服务。

系统要求

要运行本文中的示例,请确保已在计算机上安装和设置了以下软件:

  • Java 5 或更高版本
  • Tomcat 5 或更高版本
  • Ant 构建工具
  • CXF 二进制分发版 2.1

安装上述分发版以后,设置以下环境变量:

  • JAVA_HOME(用于 Java)
  • CATALINA_HOME(用于 Tomcat)
  • ANT_HOME(用于 Ant)
  • CXF_HOME(用于 CXF)

举例来说,可以设置 CXF_HOME=C:\apache-cxf-2.1 并将以下内容添加到 PATH 环境变量:

  • JAVA_HOME\bin
  • CATALINA_HOME\bin
  • ANT_HOME\bin

为什么选择 CXF?

Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构。它允许创建高性能和可扩展的服务,您可以将这样的服务部署在 Tomcat 和基于 Spring 的轻量级容器中,以及部署在更高级的服务器上,例如 Jboss、IBM® WebSphere® 或 BEA WebLogic。

功能

该框架提供了以下功能:

  • Web 服务标准支持:CXF 支持以下 Web 服务标准:
    • Java API for XML Web Services (JAX-WS)
    • SOAP
    • Web 服务描述语言(Web Services Description Language ,WSDL)
    • 消息传输优化机制(Message Transmission Optimization Mechanism,MTOM)
    • WS-Basic Profile
    • WS-Addressing
    • WS-Policy
    • WS-ReliableMessaging
    • WS-Security
  • 前端建模:CXF 提供了前端建模的概念,允许您使用不同的前端 API 来创建 Web 服务。API 允许您使用简单的工厂 Bean 并通过 JAX-WAS 实现来创建 Web 服务。它还允许您创建动态 Web 服务客户端。
  • 工具支持:CXF 提供了用于在 Java Bean、Web 服务和 WSDL 之间进行转换的不同工具。它提供了对 Maven 和 Ant 集成的支持,并无缝地支持 Spring 集成。
  • RESTful 服务支持:CXF 支持代表性状态传输(Representational State Transfer,RESTful )服务的概念,并支持 Java 平台的 JAX-RS 实现。(本系列的第 2 部分将提供有关 RESTful 服务的更多信息。)
  • 对不同传输和绑定的支持:CXF 支持不同种类的传输,从 XML 到逗号分隔值 (CSV)。除了支持 SOAP 和 HTTP 协议绑定之外,它还支持 Java Architecture for XML Binding (JAXB) 和 AEGIS 数据绑定。
  • 对非 XML 绑定的支持:CXF 支持非 XML 绑定,例如 JavaScript Object Notation (JSON) 和 Common Object Request Broker Architecture (CORBA)。它还支持 Java 业务集成(Java Business Integration,JBI)体系架构和服务组件体系架构(Service Component Architecture,SCA)。

开发 Web 服务

下面让我们深入地研究一下如何使用 JAX-WS 前端创建订单处理 Web 服务,然后将其注册为 Spring Bean。您将使用代码优先方法,这意味着您将首先开发一个 Java 类,并将其标注为 Web 服务。为此,您通常要执行以下步骤:

  1. 创建服务端点接口(service endpoint interface,SEI),并定义一个将公开为 Web 服务的方法。
  2. 创建实现类,并将其标注为 Web 服务。
  3. 创建 beans.xml,并使用 JAX-WS 前端将该服务类定义为 Spring Bean。
  4. 创建 web.xml 以集成 Spring 和 CXF。

首先让我们创建订单处理 Web 服务 SEI。

创建订单处理 Web 服务 SEI

创建名为 OrderProcess 的 SEI,它将具有一个方法 processOrder,此方法接受一个订单 Bean 并返回一个字符串。processOrder 方法的目的是处理客户所下的订单,并返回唯一的订单 ID。

清单 1. OrderProcess SEI
package demo.order;

import javax.jws.WebService;

@WebService
public interface OrderProcess {
  String processOrder(Order order);
}

从清单 1 中可以看到,OrderProcess SEI 只是一个被标注为 Web 服务的标准 Java 接口。@WebService 标注只是使该接口成为 Web 服务接口。客户端或使用者使用该接口来调用服务方法。OrderProcess SEI 具有一个服务方法 processOrder,此方法接受 Order 作为参数,并作为字符串返回订单 ID。

清单 2. OrderProcess 服务实现
package demo.order;

import javax.jws.WebService;

@WebService(endpointInterface = "demo.order.OrderProcess")
public class OrderProcessImpl implements OrderProcess {

 public String processOrder(Order order) {
  return order.validate();
 }
}

编写 SEI 的实现

要编写前一部分中的 SEI 的实现,您同样要将您的实现类 OrderProcessImpl 标注为 Web 服务,并提供属性 endpointInterface,其值为前一步中创建的 SEI 的完全限定名称。这告诉该类实现 OrderProcess SEI。由于它是 SEI 的实现,您必须提供返回订单 ID 的 processOrder 方法的实现。

您已经创建了一个 SEI 及其实现。使用 CXF,现在您可以使用 JAX-WS 前端使其成为实际的服务组件。

清单 3. beans.xml 配置文件
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:jaxws="http://cxf.apache.org/jaxws"
 xsi:schemaLocation="
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

 <import resource="classpath:META-INF/cxf/cxf.xml" />
 <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
 <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> 

 <jaxws:endpoint 
  id="orderProcess" 
  implementor="demo.order.OrderProcessImpl" 
  address="/OrderProcess" />
	  
</beans>

创建 CXF 的配置文件

CXF 配置文件实际上是包含 Bean 定义的 Spring 配置文件。您将使用 JAX-WS 前端配置来为 OrderProcess Web 服务创建 Bean 定义。beans.xml 文件中的 <jaxws:endpoint> 标记将 OrderProcess Web 服务指定为 JAX-WS 端点。这实际上意味着 CXF 在内部使用 JAX-WS 来发布此 Web 服务。您必须提供实现类名称,即 OrderProcessImpl,以及 <jaxws:endpoint> 标记的地址。您提供的地址与 Web 上下文有关。

清单 4. web.xml Web 配置文件
<web-app>
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>WEB-INF/beans.xml</param-value>
 </context-param>

 <listener>
  <listener-class>
   org.springframework.web.context.ContextLoaderListener
  </listener-class>
 </listener>

 <servlet>
  <servlet-name>CXFServlet</servlet-name>
  <display-name>CXF Servlet</display-name>
  <servlet-class>
   org.apache.cxf.transport.servlet.CXFServlet
  </servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
  <servlet-name>CXFServlet</servlet-name>
  <url-pattern>/*</url-pattern>
 </servlet-mapping>
</web-app>

最后,您需要执行以下操作:

  • 创建 web.xml 文件,此文件加载 CXF 配置文件。
  • 使用 Spring 上下文加载器来加载配置文件。
  • 注册 CXFServlet 以处理来自客户端程序的所有请求。

您刚才已完成了必需的服务器端组件的开发。现在您可以开发向 OrderProcess 服务发出请求的客户端组件。


开发客户端

从清单 5 中可以看到,创建客户端 Bean 是非常容易的,就像创建服务端点一样容易。JaxWsProxyFactory 用于创建 OrderProcess Web 服务的客户端 Bean。工厂 Bean 预期获得服务类 (OrderProcess) 和您的服务的 URL。然后通过使用工厂 Bean 引用来创建客户端 Bean 存根 OrderProcess

清单 5. client-bean.xml 客户端 Web 配置文件
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:jaxws="http://cxf.apache.org/jaxws"
 xsi:schemaLocation="
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://cxf.apache.org/jaxws 
http://cxf.apache.org/schema/jaxws.xsd">

 <bean id="client" class="demo.order.OrderProcess" 
  factory-bean="clientFactory" factory-method="create"/>
	
 <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
  <property name="serviceClass" value="demo.order.OrderProcess"/>
  <property name="address" value="http://localhost:8080/orderapp/OrderProcess"/>
 </bean>
	  
</beans>

您将创建 Java 主程序,它使用 Spring 上下文来获取已定义的客户端 Bean,然后调用 processOrder 方法。

清单 6. 客户端代码
public final class Client {

 public Client() {
 }

 public static void main(String args[]) throws Exception {
  ClassPathXmlApplicationContext context 
   = new ClassPathXmlApplicationContext(new String[] 
     {"demo/order/client/client-beans.xml"});

  OrderProcess client = (OrderProcess)context.getBean("client");
    Order order = new Order();

  String orderID = client.processOrder(order);
  System.out.println("Order ID: " + orderID);
  System.exit(0);
 }
}

运行程序

在运行程序之前,请在您的 C:\ 盘根文件夹下创建如图 1 所示的目录结构,并将本文介绍的组件放在其中:

  • Java 代码放入包文件夹中。
  • beans.xml 和 web.xml 放入 web\web-inf 文件夹中。
  • client-beans.xml 将放入 demo\order\client 文件夹中。
图 1. 代码目录结构
代码目录结构

对于构建、部署和运行 OrderProcess Web 服务和客户端,您将使用 Ant 工具。代码将部署在 Tomcat 服务器上。在 c:\orderapp 文件夹下使用 ant deploy 命令来部署代码。

应用程序文件夹 (c:\orderapp) 具有 Ant 构建文件。在运行上述命令之后,您的 orderapp 代码将作为 orderapp.war 文件部署在 Tomcat 服务器环境中。现在通过在 CATALINA_HOME\bin 文件夹下提供 catalina start 命令来启动 Tomcat Web 服务器。

orderapp 文件夹创建在 Tomcat 的 webapps 文件夹之下。启动服务器之后,通过输入 ant client 命令来运行该应用程序。输出将显示订单 ID(请参见图 2)。

图 2. 程序输出
程序输出

结束语

本文简要描述了 CXF 框架的功能,并演示了它如何使您无需多少代码编写工作即可创建 Web 服务。您了解了使用 Bean 上下文文件的 Spring 与 CXF 的集成。您还研究了该框架如何将创建 Web 服务基础结构组件的实际语义抽象出来,并为您提供一个仅集中于 Web 服务创建的更简单的 API 外壳。

现在您已经了解了使用 CXF 来创建 Web 服务的基础,请继续关注本系列的第 2 部分,其中将向您介绍如何使用 CXF 和 Spring 将 POJO 公开为 Restful 服务。


下载

描述名字大小
Order applicationorderapp.zip11KB

参考资料

学习

获得产品和技术

  • 使用 IBM 试用软件开发您的下一个项目,可下载或索取 DVD 光盘。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=SOA and web services, Open source, Java technology
ArticleID=339789
ArticleTitle=使用 Spring 和 Apache CXF 设计和实现 POJO Web 服务,第 1 部分: 使用 CXF 和 Spring 创建 Web 服务
publish-date=09182008