Apache CXF 和 Spring 開發 Web Service 1

正文

爲何使用CXF

本文段摘錄自 http://www.ibm.com/developerworks/cn/webservices/ws-pojo-springcxf/index.html
Apache CXF 是一個開放源代碼框架,提供了用於方便地構建和開發 Web 服務的可靠基礎架構。它容許建立高性能和可擴展的服務,您能夠將這樣的服務部署在 Tomcat 和基於 Spring 的輕量級容器中,以及部署在更高級的服務器上,例如 Jboss、IBM® WebSphere® 或 BEA WebLogic。html

功能前端

該框架提供瞭如下功能:java

  • 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 實現。
    對不一樣傳輸和綁定的支持: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)。

開發環境

Eclipse
Maven
Tomcat 8.0web

測試軟件 SoapUI 5.2.1spring

構建項目

下載Apache CXF 壓縮包apache

構建Maven項目(使用archetype,項目名稱爲 cxf_my_example)服務器

org.apache.cxf.archetype架構

cxf-jaxws-javafirst 3.1.4app

將項目發佈到Tomcat服務器 端口 8080 運行服務器框架

訪問wsdl地址 http://localhost:8080/cxf_my_example/HelloWorld?wsdl
響應wsdl文件表示服務發佈成功

查看配置

項目主要引用包(Maven自動配置其它包):

<dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>3.1.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>3.1.4</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>

定義接口:
@WebService註解只是標註該接口爲Web服務的訪問接口,@WebParam標註參數名稱,便於生成友好的WSDL.

@WebService
public interface HelloWorld {
    String sayHi(@WebParam(name="text")String text);
}

定義實現:
實現類也須要標註@WebService,並設置參數endpointInterface指定實現的接口的全限定名稱

@WebService(endpointInterface = "my.zhwc.cxf_my_example.HelloWorld")
public class HelloWorldImpl implements HelloWorld {

    public String sayHi(String text) {
        return "Hello " + text;
    }
}

SpringBean 配置:
如今已經建立了一個接口和實現,使用 CXF,能夠使用 JAX-WS 前端使其成爲實際的服務組件.

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

        <jaxws:endpoint 
          id="helloWorld" 
          implementor="my.zhwc.cxf_my_example.HelloWorldImpl" 
          address="/HelloWorld" />

Web.XML配置:
如今,使用Spring加載配置文件,註冊CXF Servlet 處理全部客戶端的訪問請求.

<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>

測試

打開SoapUI,新建一個空項目,添加wsdl地址[http://localhost:8080/cxf_my_example/HelloWorld?wsdl]

在請求中填入參數 cong,返回結果 Hello cong ,以下:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cxf="http://cxf_my_example.zhwc.my/">
   <soapenv:Header/>
   <soapenv:Body>
      <cxf:sayHi>
         <!--Optional:-->
         <text>cong</text>
      </cxf:sayHi>
   </soapenv:Body>
</soapenv:Envelope>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:sayHiResponse xmlns:ns2="http://cxf_my_example.zhwc.my/">
         <return>Hello cong</return>
      </ns2:sayHiResponse>
   </soap:Body>
</soap:Envelope>

編寫客戶端代碼

咱們直接在服務端工程中編寫客戶端代碼,這樣無需使用CXF 的 wsdl2java工具生成客戶端接口代碼了.

Spring 配置 client-beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<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">

	<bean id="client" class="my.zhwc.cxf_my_example.HelloWorld"
		factory-bean="clientFactory" factory-method="create" />

	<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
		<property name="serviceClass" value="my.zhwc.cxf_my_example.HelloWorld" />
		<property name="address"
			value="http://localhost:8080/cxf_my_example/HelloWorld" />
	</bean>
</beans>

Client.java

import my.zhwc.cxf_my_example.HelloWorld;

public class Client {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext context 
		   = new ClassPathXmlApplicationContext(new String[] 
		     {"classpath:my/zhwc/cxf_my_example/client/client-beans.xml"});

		  HelloWorld client = (HelloWorld)context.getBean("client");

		  System.out.println(client.sayHi("Cong"));
		  System.exit(0);
	}
}

在服務端已發佈的狀態下,運行Client.java 可得輸出 Hello Cong

參考資料

http://www.ibm.com/developerworks/cn/webservices/ws-pojo-springcxf/index.html

相關文章
相關標籤/搜索