spring boot開發soap webservice

介紹php

spring boot web模塊提供了RestController實現restful,第一次看到這個名字的時候覺得還有SoapController,很惋惜沒有,對於soap webservice提供了另一個模塊spring-boot-starter-web-services支持。本文介紹如何在spring boot中開發soap webservice接口,以及接口如何同時支持soap和restful兩種協議。java

 soap webservice git

Web service是一個平臺獨立的,低耦合的,自包含的、基於可編程的web的應用程序,既能夠是soap webservice也能夠是rest webservice,在rest還沒出來以前,咱們說webservice通常是指基於soap協議進行通訊的web應用程序。 github

 在開始以前,我以爲有必要了解下soap webservice,具體的概念網上能夠找到不少資料,但網上資料概念性較強,並且soap協議使用的是xml進行通訊,相信xml裏面一個namespace就能嚇跑一大堆人,因此這裏不討論具體的soap協議細節,我想經過一個例子來講明什麼是soap webservice,經過該例子,你能瞭解soap webservice其運做原理,固然若是你以爲你對這個已經很瞭解了,大可跳過本章節,本章節跟後面的內容沒有任何關係。web

 假設咱們開發了一個web接口,想給別人用,咱們要怎麼辦  spring

    1.部署接口到服務器 編程

    2.編寫接口文檔,寫清楚接口是經過什麼方法調的,輸入參數是什麼,輸出參數是什麼,錯誤時返回什麼。 設計模式

那問題來了,咱們能不能只把接口部署到服務器上,而後接口不單能提供具體的服務,並且還能自動生成一份標準的接口文檔,把接口信息都記錄在該文檔裏,若是能作到,是否是能作到"接口即文檔"的目的。  服務器

那麼一個接口的信息包括哪些呢?  restful

    1.接口地址 

    2.接口調用方法 

    3.接口輸入參數 

    4.接口輸出參數 

    5.接口出錯返回信息 

    6..... 

soap webservice裏wsdl文件就是接口描述信息。核心的信息就是以上幾個。

第二個問題,因爲Web service是一個平臺獨立,也就是說,使用接口的人不知道這個service是用什麼技術開發的,多是php多是java等,但接口的參數和返回的數據都是同樣的,要達到這種目的,就須要兩個東西,一個是跟平臺無關的數據格式,soap使用的是xml,一個是通訊協議,也就是soap協議。 

下面就介紹如何不使用任何框架,僅經過servlet實現一個webservice。該webservice功能很簡單,就是經過一我的的姓名查詢這我的的詳細信息。  

ps:servlet是java web的基礎,理解servlet對理解整個java web很是重要,沒寫過servlet就開始用各類框架寫接口就是在胡鬧。  

1. wsdl文件 

準備如下wsdl文件,不要管這個文件是怎麼來的,是怎麼生成的,咱們此次只講原理,不談細節,總之,你根據需求寫出了這個wsdl文件。




soap:address location裏面端口號須要修改成servlet運行的端口號。 

 從如下xml片斷能夠看出


    接口名稱是EmployeeDetail(wsdl:operation) 

    接口輸入參數是EmployeeDetailRequest(wsdl:input) 

    接口輸出參數是EmployeeDetailResponse(wsdl:output) 

    接口地址是http://localhost:8081/ws-servlet/ws/employee-detail(soap:address)





是否是很簡單,是的,爲了簡單,我直接將wsdl文件用變量存儲,咱們還須要配置下web.xml web.xml


這樣咱們訪問http://localhost:8080/ws/employee就能返回一個wsdl文件,也就是接口描述文件。在wsdl文件裏,咱們定義接口地址爲http://localhost:8080/ws/employee-detail,接下來咱們就要實現這個接口。 

 3. 業務servlet



這裏不作任何業務處理,不作xml轉bean,不作bean轉xml,就是這麼暴力,直接返回xml,但他還是一個soap服務,支持全部soap工具調用。 

將servlet配置到web.xml裏 web.xml


這個地址必須和wsdl文件裏定義的保持一致,否則服務沒法被找到。 

4. 測試 

使用soapui測試咱們的webservice,經過地址http://localhost:8081/ws-servlet/ws/employee導入wsdl文件,測試接口,返回咱們在業務servlet裏面寫死的內容。恭喜你,你已經不依賴任何第三方包完成了一個soap webservice。 

固然這個只是一個玩具,但框架就是在上面的基礎上進行擴展,增長wsdl文件自動生成,xml轉java,java轉xml,xml校驗,錯誤處理等功能,若是你有時間,你也能夠寫一個soap webservice框架。 

 代碼已經上傳至github,歡迎star,開始進入正題,偏的有點遠。 

 spring boot開發soap webservice 

1. 建立spring boot工程 

你能夠經過spring initializr初始化spring boot工程,也能夠經過inte idea的spring initializr插件進行初始化,我的推薦後面這種。 

 2. 添加依賴 

添加soap webservice相關依賴包和插件, 

 pom.xml




插件jaxb2可以實現java和xml之間互轉,下面是幾個參數的說明 

    schemaDirectory:xsd文件目錄 

    schemaFiles:指定schemaDirectory下的xsd文件,多個用逗號隔開,必須指定  schemaDirectory 

    outputDirectory:生成java文件保存目錄 

    packageName:生成java文件包路徑 

    clearOutputDir:從新生成前是否須要清空目錄 

3. 編寫xsd文件 

假設咱們的需求是經過員工工號查詢員工詳細信息,根據需求編寫如下xsd文件,並保存在/src/main/resources/目錄下。 

 employee.xsd



4. 生成java類型文件 

咱們須要根據xsd文件生成java類型文件,這就要藉助maven插件jaxb2,打開終端運行命令mvn jaxb2:xjc,若是運行正常,就會在目錄com.definesys.tutorial.ws.type下生成一堆java文件,此時文件結構以下:


5. 建立配置文件 

WebserviceConfig.java




6. 建立業務服務 

EmployeeSoapController.java



與RestController不同的是,spring boot soap是根據請求報文來指定調用的函數,RestController是根據請求路徑來肯定。@PayloadRoot就是關鍵,如本次請求報文以下:


xmlns:emp="http://www.definesys.com/xml/employee"就是@PayloadRoot.namespace,emp:EmployeeDetailRequest對應@PayloadRoot.localPart。理解了這個其餘都很好理解。

7. 測試 

使用soapui進行測試,經過地址http://localhost:8080/ws/employee.wsdl導入wsdl文件進行測試。 

輸入報文


輸出報文


同時提供soap和restful兩種服務 

soap通常在企業內部用的比較多,作系統間的集成,restful通常用於移動應用和h5應用,若是在企業應用開發裏可以同時提供兩種協議的支持,將極大提升接口的複用。其實也沒有想象中的那麼複雜,在本例中,只需把業務邏輯部分用service實現再建立一個RestController便可,經過設計模式便可解決,不須要引入新的技術。 

 EmployeeService.java



EmployeeSoapController.java



EmployeeRestController.java



測試


這樣就實現了soap和rest同時提供的目的。

本人創業團隊產品MadPecker,主要作BUG管理、測試管理、應用分發

網址:www.madpecker.com,有須要的朋友歡迎試用、體驗!

本文爲MadPecker團隊技術人員編寫,轉載請標明出處

相關文章
相關標籤/搜索