开发自上而下的Web服务项目
這是從Alessio Soldano編輯的Advanced JAX-WS Web Services手冊中摘錄的示例章節。
第一章介紹了自底向上創建Web服務端點的方法。 它允許非常快地將現有bean作為Web Service端點公開:在大多數情況下,將類轉換為端點只需在代碼中添加少量注釋即可。
但是,當使用已定義的合同開發服務時,使用自頂向下方法要簡單得多(有效),因為wsdl-to-java工具可以生成與WSDL匹配的帶注釋的代碼。 這是在多種情況下(例如以下情況)的首選解決方案:
- 創建一個服務,該服務遵循預先開發的XML Schema和WSDL;
- 公開符合第三方規定的合同的服務(例如,使用已定義的一組消息調用該服務的供應商);
- 在保持與較舊客戶端的兼容性的同時,替換現有Web Service的實現(不得更改合同)。
在下一節中,將提供一個自上而下的 Web Service端點開發示例,以及有關開發人員在編碼時必須意識到的約束的一些詳細信息,無論選擇哪種方法。
使用自上而下的方法創建Web服務
為了建立一個包括Web服務端點和JAX-WS客戶端的完整項目,我們將使用兩個Maven項目。 第一個將是一個標準的webapp-javaee7項目,其中將包含Web服務端點。 第二個只是一個快速啟動的Maven項目,它將對Web Service執行一個測試用例。
讓我們像往常一樣開始創建服務器項目:
mvn -DarchetypeGroupId=org.codehaus.mojo.archetypes -DarchetypeArtifactId=webapp-javaee7 -DarchetypeVersion=0.4-SNAPSHOT -DarchetypeRepository=https://nexus.codehaus.org/content/repositories/snapshots -DgroupId=com.itbuzzpress.chapter2.wsdemo -DartifactId=ws-demo2 -Dversion=1.0 -Dpackage=com.itbuzzpress.chapter2.wsdemo -Darchetype.interactive=false --batch-mode --update-snapshots archetype:generate下一步將根據WSDL合同創建Web服務接口和存根。 步驟與為同一合同建立客戶的步驟相似。 唯一的區別是wsconsume腳本會將生成的源文件輸出到我們的Maven項目中:
$ wsconsume.bat -k CustomerService.wsdl -o ws-demo-wsdl\src\main\java除了本章開始討論的生成的類之外,我們還需要提供一個包含Web服務功能的服務端點實現 :
@WebService(endpointInterface="org.jboss.test.ws.jaxws.samples.webresult.Customer") public class CustomerImpl implements Customer {public CustomerRecord locateCustomer(String firstName, String lastName, USAddress address) {CustomerRecord cr = new CustomerRecord();cr.setFirstName(firstName);cr.setLastName(lastName);return cr;} }端點實現類實現端點接口并通過@WebService批注引用它。 我們的WebService類什么也沒做,只是使用接收到的參數作為輸入創建一個CustomerRecord對象。 在一個真實的示例中,您將使用例如持久層來收集CustomerRecord。
一旦將實現類包含在項目中,則需要將項目打包并部署到目標容器,這將使用與該工具使用的相同的合約公開服務端點。
還可以在服務接口的@WebService wsdlLocation屬性中引用本地WSDL文件,并將該文件包含在部署中。 這樣可以準確地提供所提供的文檔。
如果要將Web服務部署到WildFly應用程序服務器,則可以從管理控制臺(如管理控制臺)中檢查端點現在是否可用。 選擇“上層運行時”選項卡,然后單擊“左側子系統左側”選項中包含的“ Web服務”鏈接:
JAX-WS端點的需求
無論選擇哪種方法來開發JAX-WS端點,實際的實現都需要滿足一些要求:
- 必須使用j avax.jws.WebService或javax.jws.WebServiceProvider批注對實現類進行批注。
- 實現類可以通過@WebService批注的endpointInterface元素顯式引用服務終結點接口,但這不是必需的。 如果@WebService中沒有指定endpointInterface,服務端點接口被隱含的實現類定義。
- 實現類的業務方法必須是公共的,并且不能聲明為靜態或最終的。
- javax.jws.WebMethod批注將用于公開給Web服務客戶端的業務方法。 如果沒有使用@WebMethod注釋任何方法,則將公開所有業務方法。
- 向Web服務客戶端公開的業務方法必須具有與JAXB兼容的參數和返回類型。
- 實現類不能聲明為final,并且不能抽象。
- 實現類必須具有默認的公共構造函數,并且不能定義finalize方法。
- 實現類可以在其方法中為生命周期事件回調使用javax.annotation.PostConstruct或javax.annotation.PreDestroy注釋。
構建和運行JAX-WS客戶端的要求
JAX-WS客戶端可以是任何Java項目的一部分,并且不需要明確要求它是部署在JavaEE容器上的JAR / WAR歸檔的一部分。 例如,客戶端可以簡單地包含在快速入門Maven項目中,如下所示:
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId=com.itbuzzpress.chapter2.wsdemo -DartifactId=client-demo-wsdl -Dversion=1.0 -Dpackage=com.itbuzzpress.chapter2.wsdemo -Dversion=1.0 -Darchetype.interactive=false --batch-mode由于您的客戶端需要引用端點接口和存根,因此需要提供它們或者從服務器項目復制它們,或者使用wsconsume再次生成它們:
$ wsconsume.bat -k CustomerService.wsdl -o client-demo-wsdl\src\main\java現在包括一個最小的Client Test應用程序,它是JUnit測試用例的一部分:
public class AppTest extends TestCase {public void testApp() {CustomerService service = new CustomerService();Customer port = service.getCustomerPort();CustomerRecord record = port.locateCustomer("John", "Li", new USAddress()); System.out.println("Customer record is " +record);assertNotNull(record);} }編譯并運行測試
為了成功運行WS客戶端應用程序,需要正確設置類加載器,以包括所需的JAX-WS實現庫(以及所需的傳遞依賴項(如果有))。 根據客戶端要在其中運行的環境,這可能意味著向類路徑添加了一些jar,或者向Maven依賴關系樹添加了一些工件依賴項,正確設置了IDE等。
由于Maven用于構建包含客戶端的應用程序,因此您可以按以下方式配置pom.xml ,使其包含對JBossWS的依賴關系:
<dependency><groupId>org.jboss.ws.cxf</groupId> <artifactId>jbossws-cxf-client</artifactId> <version>4.2.3.Final</version><scope>provided</scope> </dependency>現在,您可以執行測試用例,該用例將調用JAX-WS API以使用JBossWS服務客戶端調用。
mvn clean package test專注于客戶端使用的JAX-WS實現
通過在應用程序類加載器中查找META-INF / services / javax.xml.ws.spi.Provider資源,可以在運行時選擇要用于運行JAX-WS客戶端的JAX-WS實現。 每個JAX-WS實現都有一個庫(jar),該庫包含該資源文件,該資源文件在內部引用實現JAX-WS SPI提供程序的適當類。
在WildFly 8.0.0.Final應用程序服務器上,JAX-WS實現包含在文件jbossws-cxf-factories-4.2.3.Final的META-INF / services / javax.xml.ws.spi.Provider中:
org.jboss.wsf.stack.cxf.client.ProviderImpl因此,控制構建應用程序類加載器的類路徑中包含哪些工件或jar庫非常重要。 如果找到多個實現,則順序很重要,因此將使用類路徑中的第一個實現。
避免任何類路徑問題(從而加載另一個JAX-WS實現)的最安全方法是將java.endorsed.dirs系統屬性設置為包含jbossws-cxf-factories.jar; 如果不這樣做,請確保沒有在類路徑之前包含其他META-INF / services / javax.xml.ws.spi.Provider資源,這將觸發另一個JAX-WS實現。
最后,如果打算將JAX-WS客戶端作為JavaEE應用程序的一部分在WildFly上運行,則將自動選擇JBossWS JAX-WS實現來為客戶端提供服務。
該摘錄摘自“ Advanced JAX-WS Web Services ”一書,在該書中,您將學習基于SOAP的Web服務體系結構的概念,并獲得有關在企業中構建和部署Web服務的實用建議。
本書從設置開發環境的基礎知識和最佳實踐入手,以清晰簡潔的方式介紹了JAX-WS的內部細節。
您還將了解可用于創建,編譯和測試SOAP Web服務的主要工具包,以及如何解決常見問題,例如調試數據和保護其內容。
您將從這本書中學到什么:
- 使用SOAP Web服務邁出第一步。 安裝開發和測試應用程序所需的工具。
- 使用自上而下和自下而上的方法開發Web服務。
- 使用Maven原型加快Web服務的創建。
- 深入探討JAX-WS類型的詳細信息:Java到XML的映射以及XML到Java的映射
- 在WildFly 8和Tomcat上開發SOAP Web服務。 在WildFly上運行本機Apache CXF。
- 保護Web服務。 將身份驗證策略應用于您的服務。 加密通信。
翻譯自: https://www.javacodegeeks.com/2014/09/developing-a-top-down-web-service-project.html
總結
以上是生活随笔為你收集整理的开发自上而下的Web服务项目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 建造师证备案是什么意思(建造师证备案)
- 下一篇: 电脑视频传到安卓手机哪个文件夹里(电脑视