1. 程式人生 > >webService學習之路(三):springMVC整合CXF後呼叫已知的wsdl介面

webService學習之路(三):springMVC整合CXF後呼叫已知的wsdl介面

本篇文章將講解SpringMVC+CXF環境下,怎麼呼叫其他系統通過webService方式暴露出來的介面

① 為避免懷疑同一個專案中呼叫本專案的介面,這裡我新開啟一個eclipse通過最原始的方式釋出了一個webservice並啟動保證可以被訪問

開啟瀏覽器確認可以被訪問

②進入CXF/bin 利用wsdl2java工具將webService介面轉換為可供呼叫的java類。呼叫方式wsdl2java   XXXXX?wsdl

執行完成後,你會發現bin目錄下多了一個資料夾,資料夾路徑和介面包路徑一致

③ 將生成的java檔案拷貝到需要呼叫介面的專案中,請注意保持包的路徑一致。

④ 介面的呼叫,前面的都是準備工作。 o(∩_∩)o 

   繼webService學習之路二基礎上,整合好CXF後並保證xml中名稱空間都已經正確

   在applicationContext.xml中新增如下配置:

複製程式碼
<import resource="classpath:META-INF/cxf/cxf.xml" />

    <!-- 注意:serviceClass為介面類並非實現類 -->
    <!-- <jaxws:server serviceClass="com.xiaochangwei.web.service.WebserviceTest" 
        address="/webSerciceTest_service_jaxws
"></jaxws:server> --> <!-- 注意:implementor為介面的具體實現類 --> <!-- <jaxws:endpoint implementor="com.xiaochangwei.web.service.impl.WebServiceTestImpl" address="/webSerciceTest_endpoint" ></jaxws:endpoint> --> <jaxws:client id="webServiceBean" serviceClass="
webservice.server.Service" address="http://localhost:9999/service" />
複製程式碼

請注意address後面不需要新增?wsdl

⑤ 在Controller層寫一個測試程式碼進行測試

複製程式碼
package com.xiaochangwei.web.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import webservice.server.Service;
@Controller
@RequestMapping("webServiceTest")
public class WebServiceTestController {

    @Autowired
    private Service webServiceBean;
    
    @RequestMapping("test")
    public @ResponseBody String test(){
        
        return webServiceBean.getWelcome("xiaochangwei");
    }
}
複製程式碼

後經自己折騰發現,controller這裡的名字不需要和xml中的一致,因為採用的是ioc, by tye吧 

⑥ 開啟瀏覽器見證奇蹟的時刻到了

並且檢視介面釋出端,控制檯也打印出了 service called   。至此,呼叫webService介面結束。

怎麼能這麼順利的就完成了,喜歡折騰的我怎麼可能不折騰下. 經過折騰發現

① controller中注入的介面例項名稱可以和xml中的不一樣,因為採用的是ioc by type, 最開始我還以為和普通bean getbean(id)不同,必須一樣吶

複製程式碼
package com.xiaochangwei.web.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import webservice.server.Service;
@Controller
@RequestMapping("webServiceTest")
public class WebServiceTestController {

    @Autowired
    private Service service;
    
    @RequestMapping("test")
    public @ResponseBody String test(){
        
        return service.getWelcome("xiaochangwei ok");
    }
}
複製程式碼

這樣也是可行的

② xml配置中,我以為可以不指定id,因為我們不用getbean(id)進行呼叫,經摺騰發現,id是必須的 否則報 Id is required for element 'client' when used as a top-level tag

③ 我想去掉xml中的jaxws:clent 配置,而直接在生成的介面service.java 檔案上增加@Component 或者 @Service來進行注入,經嘗試失敗了,不過我還會繼續折騰的

每天折騰一點點

噢 錯了,是每天進步一點點

至此 webservice學習之路全部完結,有不懂的地方和有錯誤的地方請及時告知我,共勉

未整理的原始碼下載:http://pan.baidu.com/s/1eSuIQxs (請勿用於商業專案,若需使用請完善,整理好的程式碼近期會更新上去)