cxf+spring發佈webservice接口及接口的調用

http://blog.csdn.net/cuihuaming198809/article/details/8243361

一、CXF介紹

Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire。CXF 繼承了 Celtix 和 XFire 兩大開源項目的精華,提供了對 JAX-WS 全面的支持,並且提供了多種 Binding 、DataBinding、Transport 以及各種 Format 的支持,並且可以根據實際項目的需要,採用代碼優先(Code First)或者 WSDL 優先(WSDL First)來輕鬆地實現 Web Services 的發佈和使用。Apache CXF已經是一個正式的Apache頂級項目。CXF支持多種協議,如:SOAP、XML/HTTP、RESTful HTTP 、 CORBA ,並且可以在多種傳輸協議上運行,比如:HTTP、JMS 、 JBI。CXF可以與Spring進行無縫集成。

CXF 框架是一種基於 Servlet 技術的 SOA 應用開發框架,要正常運行基於 CXF 應用框架開發的企業應用,除了 CXF 框架本身之外,還需要 JDK 和 Servlet 容器的支持。

CXF 下載地址:http://cxf.apache.org/download.html,選擇“File”列中的zip格式下載。解壓後可以看到一些文件夾:

└─apache-cxf-2.5.0
├─bin 各種工具
├─docs API文檔
├─etc 各種配置文件
├─lib 開發所需jar包
├─licenses 說明
├─modules jar包

└─samples 使用例子

samples文件夾中給提供了在各種環境下使用的例子,個人感覺只需參照樣例即可。


二、使用CXF+Spring編寫併發布WebService

首先,新建一個Web項目,名字叫cxftest,將下載的壓縮包中lib文件夾下的jar包全部拷貝到項目的WEB-INF/lib中,在web.xml中配置如下:

  1. <servlet>
  2. <servlet-name>CXFServlet</servlet-name>
  3. <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  4. <load-on-startup>1</load-on-startup>
  5. </servlet>
  6. <servlet-mapping>
  7. <servlet-name>CXFServlet</servlet-name>
  8. <url-pattern>/services/*</url-pattern>
  9. </servlet-mapping>
然後,在項目src目錄下新建包:com.test,在新建的包中創建TestService.java,代碼如下:

  1. package com.test;
  2. import javax.jws.WebService;
  3. @WebService
  4. public interface TestService {
  5. public String sayHi(String name);
  6. }

接着,在創建TestServiceImpl.java,代碼如下:

  1. package com.test;
  2. import javax.jws.WebService;
  3. @WebService(endpointInterface="com.test.TestService")
  4. public class TestServiceImpl implements TestService {
  5. public String sayHi(String name) {
  6. return name+", welcome to here!";
  7. }
  8. }
CXF中採用註解的方式聲明哪些類作爲WebService進行發佈,

@WebService:聲明webservice接口;

@WebService(endpointInterface="com.test.TestService"):聲明這個類是TestService接口的實現類。
其次,在WEB-INF下新建cxf-servlet.xml文件,代碼如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:jaxws="http://cxf.apache.org/jaxws"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
  8. <import resource="classpath:META-INF/cxf/cxf.xml" />
  9. <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
  10. <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
  11. <jaxws:server id="testService" serviceClass="com.test.TestService" address="/testService">
  12. <jaxws:serviceBean>
  13. <bean class="com.test.TestServiceImpl" />
  14. </jaxws:serviceBean>
  15. </jaxws:server>
  16. </beans>
id:自定義,serviceClass:接口類的完整包名,address:此接口的訪問路徑,<jaxws:serviceBean/>標籤用於配置接口的實現類

然後,在web.xml中配置啓動時加載cxf-servlet.xml,並配置Spring的監聽器,代碼如下:

  1. <context-param>
  2. <param-name>contextConfigLocation</param-name>
  3. <param-value>/WEB-INF/cxf-servlet.xml</param-value>
  4. </context-param>
  5. <listener>
  6. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  7. </listener>

web.xml文件的完整內容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  6. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  7. <context-param>
  8. <param-name>contextConfigLocation</param-name>
  9. <param-value>/WEB-INF/cxf-servlet.xml</param-value>
  10. </context-param>
  11. <listener>
  12. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  13. </listener>
  14. <servlet>
  15. <servlet-name>CXFServlet</servlet-name>
  16. <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  17. <load-on-startup>1</load-on-startup>
  18. </servlet>
  19. <servlet-mapping>
  20. <servlet-name>CXFServlet</servlet-name>
  21. <url-pattern>/services/*</url-pattern>
  22. </servlet-mapping>
  23. </web-app>
最後,發佈到tomcat中並啓動,在瀏覽器中輸入http://localhost:8080/cxftest/services/testService?wsdl,發佈成功!

三、測試發佈的WebService,生成客戶端代碼調用WebService

在瀏覽器中輸入http://localhost:8080/cxftest/services/testService/sayHi?arg0=andy,返回內容正常,調用成功!這裏要注意一點,在瀏覽器中測試接口時,參數名一定要和WSDL文檔中的參數名一致,否則會出錯。

生成客戶端代碼,這裏使用CXF自帶的wsdl2java.bat工具生成客戶端代碼:wsdl2java.bat在bin文件夾中,在cmd窗口中進入到wsdl2java.bat所在目錄下,

使用如下命令生成客戶端代碼:wsdl2java -d src -all http://localhost:8080/cxftest/services/testService?wsdl

-d:表示將轉化後的代碼放到哪裏,如果不帶此參數,則默認放到wsdl2java.bat所在目錄下;

-all:以什麼樣的方式生成客戶端代碼,還有其他可選參數,這裏不加闡述了,可以直接使用wsdl2java名來查看其他參數。

生成的客戶端文件:ObjectFactory.java、package-info.java、SayHi.java、SayHiResponse.java、TestService.java、TestServiceImpl.java、

TestServiceService.java、TestService_TestServicePort_Client.java、TestService_TestServicePort_Server.java

TestService_TestServicePort_Client.java和TestService_TestServicePort_Server.java可以不要,前者是調用接口的例子,後者是發佈接口的例子。

新建一個InvokeService.java,代碼如下:

  1. import com.test.TestService;
  2. import com.test.TestServiceService;
  3. public class InvokeService {
  4. public static void main(String[] args) {
  5. TestService s = new TestServiceService().getTestServicePort();
  6. System.out.println(s.sayHi("andy"));
  7. }
  8. }
輸出值:andy, welcome to here! ,調用成功!
發佈了23 篇原創文章 · 獲贊 75 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章