簡體   English   中英

wsimport生成的客戶端如何工作?

[英]How does a wsimport generated client work?

在此之前,我想讓您知道我已經可以連接到Web服務服務器了。 我問這個問題是因為我希望深入了解wsimport生成的客戶端是如何工作的。 根據我的研究,wsimport使用JAXWS。 請注意,我不了解JAXWS。

我使用wsimport生成了我的客戶端。 我使用的WSDL來自Axis2 Web服務,由Axis2自動生成。 下面的類是wsimport的結果:

com.datamodel.xsd

  • DataBeanRequest.java
  • DataBeanResponse.java
  • ObjectFactory.java
  • package-info.java

com.service

  • MyWebService.java
  • MyWebServicePortType.java
  • MyMethod.java
  • MyMethodResponse.java
  • ObjectFactory.java
  • package-info.java

使用上面的類,我可以告訴com.datamodel.xsd包含Web服務服務器使用的bean(不包括ObjectFactorypackage-info )。 同時, MyMethodMyMethodResponse也是用於設置Web服務方法/操作的請求和響應參數的bean。

以下是我的問題:(如果你不知道我的一些問題的答案,你真的不必回答所有問題。:)請隨時分享你認為我可能會覺得有用的任何信息。)

我是否正確

  • 我的上述假設是否正確?
  • 其他課程的功能是什么?
  • 我檢查了MyWebService ,它包含一個注釋,指的是我用來生成客戶端的WSDL的絕對位置。 在客戶端中指定wsdllocation的相關性是什么? 客戶如何使用該信息?
  • 我注意到Web服務的實際URL未在生成的任何類中聲明。 客戶如何知道需要連接的位置?
  • 是否對WSDL文件進行了注釋,以便客戶端可以在連接時讀取WSDL文件上的URL? 如果是這樣,那么是否意味着在必須建立新連接時始終讀取WSDL文件?
  • 由於我需要編譯我的應用程序並將其安裝在不同的服務器上,因此將無效。 我可以將其設置為相對路徑而不是絕對路徑嗎? 怎么樣? (答案:是的,它可以被設置為一個相對路徑的。 wsimport命令有一個 wsdllocation屬性,其中所述的值 wsdllocation可以被指定。)
  • 如果我需要連接到HTTPS,該怎么辦? 如何設置服務器證書?
  • 當我使用wsimport生成客戶端時以及使用Axis2或Apache CXF生成客戶端時有什么區別。

在回答問題之前,請先澄清一下:JAX-WS是用Java實現Web服務的規范。 它描述了如何將WSDL工件映射到Java類以及如何使用注釋應用此映射。 您可以在此處下載規范 工具wsimport是本規范的參考實現的一部分,參考實現是Java類庫的一部分。 有幾種替代實現,例如Axis2,CXF或Metro,它們通過支持其他標准(如WS-ReliableMessaging或WS-Security)來增強基本的JAX-WS支持。

現在回答你的問題:

我的上述假設是否正確?

是的,你是。

其他課程的功能是什么?

package-info用於將Web服務中使用的XML命名空間映射到實現類所在的包。 命名空間通常看起來與Java包名稱不同(通常是URL),這使映射成為必要。

ObjectFactory允許您創建服務發送和接收的任何消息。 如果要在存根類前面掛鈎代碼,提供修改后的消息或類似的東西,則需要這樣做。

我無法看到您的類的內容,但如果我理解它, MyWebServicePortType是一個類似於WSDL中的portType的接口。 也就是說,它將WSDL中的操作及其簽名映射到Java方法。 如果您想提供服務(您不需要提供服務,請詢問客戶端),您需要實現此接口。 在實現客戶端時,您只需使用它。

最后,如果要調用Web服務,類MyWebService包含您需要的客戶端存根。

我檢查了MyWebService,它包含一個注釋,指的是我用來生成客戶端的WSDL的絕對位置。 在客戶端中指定wsdllocation的相關性是什么? 客戶如何使用該信息?

您生成的接口包含服務的portType的簽名,但它不解釋您如何與服務進行通信。 這是WSDL中綁定的一部分。 最基本的設置是使用SOAP over HTTP的消息的文檔/文字樣式。 其他配置(例如SOAP over JMS)是可能的,您的客戶端需要知道要使用的協議。 因此它需要綁定WSDL。 此外,正如您稍后所述,Java文件中沒有端點地址。 此地址也是從WSDL中讀取的。

我注意到Web服務的實際URL未在生成的任何類中聲明。 客戶如何知道需要連接的位置?

它從WSDL中的service port讀取address 這位於WSDL的末尾。

是否對WSDL文件進行了注釋,以便客戶端可以在連接時讀取WSDL文件上的URL?

不, port是具體Web服務端點的典型元素。 這里沒有什么特別的需要。

如果是這樣,那么是否意味着在必須建立新連接時始終讀取WSDL文件?

好吧,客戶端可能有緩存(我不知道這個參考實現的細節)。 從概念的角度來看:是的,它是。

如果我需要連接到HTTPS,該怎么辦? 如何設置服務器證書

這可能很棘手,我不能給你一個開箱即用的答案。 我建議閱讀有關此主題的問題, 例如本主題。

當我使用wsimport生成客戶端時以及使用Axis2或Apache CXF生成客戶端時有什么區別

就在這里。 wsimport更好,不要使用wsdl2java。 這是一個描述,為什么

您問:我注意到Web服務的實際URL未在生成的任何類中聲明。 客戶如何知道需要連接的位置?

如果使用瀏覽器下載WSDL並將其作為輸入傳遞給wsimport ,則將本地wsdl文件位置嵌入到生成的代碼中。 這就是您在生成的代碼中看不到實際服務位置的原因。 這也意味着如果刪除了wsdl文件的本地副本,則生成的代碼將無法工作(使用main方法進行inovked時)。

如果將wsdl的URL作為輸入傳遞給wsimport,則該URL嵌入在生成的代碼中,該代碼還用於獲取實際的服務位置。 我們的想法是WSDL位置是固定的。 它們應該在UDDI中或作為本地文件。 這允許實際服務移動,如果它們移動,您只需要單獨修改wsdl文件的本地副本或更新UDDI中的wsdl。 [大多數情況下這不會發生,因為服務地點永遠不是IP而是DNS名稱]

這就是為什么在運行webservice的同一服務器中發布wsdl永遠不是一個好主意

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM