2008 年 9 月 18 日
使用开放源代码 Web 服务框架 Apache CXF 可以很容易地创建传统 Java™ 对象(plain old Java object ,POJO)样式的 Web 服务。本文是本系列的第 1 部分,将向您介绍如何使用 Spring 和 CXF 将 POJO 作为 Web 服务公开。本文还将演示 CXF 与 Spring 框架的集成。<!-- START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --> <!-- END RESERVED FOR FUTURE USE INCLUDE FILES-->
在本文中,您将使用 CXF 和 Spring 来构建和开发一个订单处理 Web 服务。该 Web 服务处理或验证客户所下的订单,并返回唯一的订单 ID。阅读本文之后,您将能够应用 CXF 的概念和功能来构建和开发 Web 服务。
要运行本文中的示例,请确保已在计算机上安装和设置了以下软件:
安装上述分发版以后,设置以下环境变量:
举例来说,可以设置 CXF_HOME=C:\apache-cxf-2.1 并将以下内容添加到 PATH 环境变量:
|
|
Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构。它允许创建高性能和可扩展的服务,您可以将这样的服务部署在 Tomcat 和基于 Spring 的轻量级容器中,以及部署在更高级的服务器上,例如 Jboss、IBM® WebSphere® 或 BEA WebLogic。
该框架提供了以下功能:
|
|
下面让我们深入地研究一下如何使用 JAX-WS 前端创建订单处理 Web 服务,然后将其注册为 Spring Bean。您将使用代码优先方法,这意味着您将首先开发一个 Java 类,并将其标注为 Web 服务。为此,您通常要执行以下步骤:
首先让我们创建订单处理 Web 服务 SEI。
创建名为 OrderProcess
的 SEI,它将具有一个方法 processOrder
,此方法接受一个订单 Bean 并返回一个字符串。processOrder
方法的目的是处理客户所下的订单,并返回唯一的订单 ID。
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。
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 的实现,您同样要将您的实现类 OrderProcessImpl
标注为 Web 服务,并提供属性 endpointInterface
,其值为前一步中创建的 SEI 的完全限定名称。这告诉该类实现 OrderProcess
SEI。由于它是 SEI 的实现,您必须提供返回订单 ID 的 processOrder
方法的实现。
您已经创建了一个 SEI 及其实现。使用 CXF,现在您可以使用 JAX-WS 前端使其成为实际的服务组件。
<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 配置文件实际上是包含 Bean 定义的 Spring 配置文件。您将使用 JAX-WS 前端配置来为 OrderProcess
Web 服务创建 Bean 定义。beans.xml 文件中的 <jaxws:endpoint>
标记将 OrderProcess
Web 服务指定为 JAX-WS 端点。这实际上意味着 CXF 在内部使用 JAX-WS 来发布此 Web 服务。您必须提供实现类名称,即 OrderProcessImpl
,以及 <jaxws:endpoint>
标记的地址。您提供的地址与 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> |
最后,您需要执行以下操作:
您刚才已完成了必需的服务器端组件的开发。现在您可以开发向 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
方法。
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 所示的目录结构,并将本文介绍的组件放在其中:
对于构建、部署和运行 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)。
本文简要描述了 CXF 框架的功能,并演示了它如何使您无需多少代码编写工作即可创建 Web 服务。您了解了使用 Bean 上下文文件的 Spring 与 CXF 的集成。您还研究了该框架如何将创建 Web 服务基础结构组件的实际语义抽象出来,并为您提供一个仅集中于 Web 服务创建的更简单的 API 外壳。
现在您已经了解了使用 CXF 来创建 Web 服务的基础,请继续关注本系列的第 2 部分,其中将向您介绍如何使用 CXF 和 Spring 将 POJO 公开为 Restful 服务。