歡迎您光臨本站 註冊首頁
  
使用開放源代碼 Web 服務框架 Apache CXF 可以很容易地創建傳統 Java™ 對象(plain old Java object ,POJO)樣式的 Web 服務。本文是本系列的第 1 部分,將向您介紹如何使用 Spring 和 CXF 將 POJO 作為 Web 服務公開。本文還將演示 CXF 與 Spring 框架的集成。

引言

在本文中,您將使用 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 服務。(責任編輯:A6)



[火星人 ] 使用 Spring 和 Apache CXF 設計和實現 POJO Web 服務,第 1 部分: 使用 CXF 和 Spring 創建 Web 服務已經有725次圍觀

http://coctec.com/docs/linux/show-post-69121.html