用 WebSphere Studio 在 JMS 或 HTTP 上使用 SOAP 訪問 EJB Web 服務

發表于:2007-06-22來源:作者:點擊數: 標簽:
引言 首先, 下載 HelloWorldApp.zip ,將其解壓縮,得到 HelloWorld.ear ,然后單擊右側的步驟 1,開始以下六個步驟。 圖 1.在 HTTP 和 JMS 上使用 SOA P 訪問 EJB Web 服務 如果想繞過創建和修改 Web 服務這一步,可以 下載 HelloWorldApp.zip (如果您還

   

引言
首先,下載 HelloWorldApp.zip,將其解壓縮,得到 HelloWorld.ear,然后單擊右側的步驟 1,開始以下六個步驟。

圖 1.在 HTTP 和 JMS 上使用 SOAP 訪問 EJB Web 服務

如果想繞過創建和修改 Web 服務這一步,可以下載HelloWorldApp.zip(如果您還沒有下載的話)并解壓縮得到 HelloWorldSolution.ear。然后按照下面的步驟來測試這個方案:

  1. HelloWorldSolution.ear 文件導入到 Application Developer V5.1.1 工作區。
    • 選擇 File => Import。
    • 選擇 EAR File 然后單擊 Next。
    • 在 Enterprise Application Import 窗口,定位到保存 EAR 文件的位置。
    • 選擇 HelloWorldSolution.ear,然后單擊 Open。
    • 設置 Project Name 為 HelloWorld。
    • 單擊 Finish。
  2. webservices.jar 文件添加到 HelloWorldWebRouter 的構建路徑中。
    • 在 J2EE Perspective's Project Navigator 視圖下,右鍵單擊 HelloWorldWebRouter 模塊,選擇 Properties。
    • 在左側欄中選擇 Java Build Path。
    • 在左側欄中選擇 Libraries 選項卡。
    • 單擊 Add Variable。
    • 向下滾動,選擇 WAS_50_PLUGINDIR 變量然后單擊 Extend...。
    • 選擇 file lib => webservices.jar 然后單擊 OK。
    • 單擊 OK。
  3. webservices.jar 文件添加到 HelloWorldJMSRouter 的構建路徑中。
    • 在 J2EE Perspective's Project Navigator 視圖下,右鍵單擊 HelloWorldWebRouter 模塊,選擇 Properties。
    • 在左側欄中選擇 Java Build Path。
    • 在左側欄中選擇 Libraries 選項卡。
    • 單擊 Add Variable。
    • 向下滾動,選擇 WAS_50_PLUGINDIR 變量然后單擊 Extend...。
    • 選擇 file lib => webservices.jar 然后單擊 OK。
    • 單擊 OK。
  4. 為通過 JMS 傳輸 SOAP 配置服務器(參閱步驟 2.為通過 JMS 傳輸 SOAP 配置 WebSphere Application Server 測試環境)。
  5. 測試 Web 服務(參閱步驟 6.為兩種傳輸方法測試 Web 服務客戶機)。

步驟 1.導入 HelloWorld 企業應用程序
HelloWorld Enterprise Application Archive(EAR)這個文件包含一個 EJB 模塊——HelloWorldEJB。這個模塊里有一個無狀態會話 bean——HelloWordSSB。該 bean 有一個 getMessage() 方法,調用這個方法時會返回一個字符串“Hello World”。下載 HelloWorld.ear 按照下面步驟將 EAR 文件導入到 Application Developer 工作區。

  1. HelloWorld.ear 文件導入到 Application Developer 工作區。
    • 選擇 File => Import。
    • 選擇 EAR File,然后單擊 Next。
  2. 在 Enterprise Application Import 窗口,定位到保存 EAR 文件的位置,然后選擇 HelloWorld.ear 文件。
  3. 設置 Project Name 為 HelloWorld(缺省值)。
  4. 單擊 Finish。

步驟 2.為通過 JMS 傳輸 SOAP 配置 WebSphere Application Server 測試環境
要為 Web 服務實現提供 SOAP/JMS 支持,必須創建所需的 JMS 資源(隊列(Queue)、隊列連接工廠(Queue Connection Factories)和偵聽器端口(Listener Ports))來處理和響應傳入的消息。下面的步驟介紹了如何為實現 HelloWorld Web 服務配置所需的 JMS 資源。

  1. 創建新的 Server Configuration。
    • 選擇 File => New => Other。
    • 在左側欄中單擊 Server。
    • 在左側欄中單擊 Server 和 Server Configuration。
    • 單擊 Next。
    • 在 Create a new server and server configuration 的窗口中:
      • 設置 Server Name 為“TestServer”。
      • 設置 Server Type 為 WebSphere version 5.1 => Test Environment (缺省選項)。
    • 單擊 Finish。

      創建操作所得的新服務器配置和服務器配置條目如圖 2 所示。

      圖 2.創建新服務器和服務器配置

  2. 打開 Server Perspective 和 TestServer settings 窗口。
    • 選擇 Window => Open Perspective => Other。
    • 選擇 Server 然后單擊 OK。
    • 在 Server Perspective's Server Configuration 視圖(在屏幕的左下方)中,展開 Servers 并雙擊 TestServer。
  3. 在 Server Settings 窗口中,選擇 JMS 選項卡以打開 WebSphere JMS Provider Options。
  4. 創建一個隊列:
    • Server Settings => JMS Server Properties 下單擊 Add。
    • 在彈出的 Add Queue Name 窗口中,設置 Name 為“HWInboundQ”。
    • 單擊 OK。
    • Server Settings => JMS Server Properties => JMS Provider 下選中 MQ Simulator for Java Developers 單選框。
  5. 為入站隊列創建一個隊列連接工廠(QCF)。
    • Server Settings => JMS Connection Factories => WASQueueConnection Factory 條目下單擊 Add。
    • 在彈出的 Add WASQueueConnectionFactory 窗口中:
      • 設置 Name 為“HWInboundQCF”。
      • 設置 JNDI name 為“jms/HWQCF”。
    • 單擊 OK。

      添加操作所得的 WASQueueConnectionFactory 條目如圖 3 所示。

      圖 3.添加 WASQueueConnectionFactory - HWInboundQCF

  6. 為出站隊列創建一個出站 QCF。(為通過 JMS 傳輸 SOAP 發送一個響應消息,這個條目是必需的而且一定要如下所示。)
    • Server Settings => JMS Server Properties => WASQueueConnection Factory 條目下單擊 Add。
    • 在彈出的 Add WASQueueConnectionFactory 窗口中:
      • 設置 Name 為“WebServicesReplyQCF”。
      • 設置 JNDI name 為“jms/WebServicesReplyQCF”。
    • 單擊 OK。

      添加操作所得的 WASQueueConnectionFactory 條目如圖 4 所示。

      圖 4.添加 WASQueueConnectionFactory - WebServicesReplyQCF

  7. 為傳入消息創建一個 JMS Destination。
    • Server Settings => JMS Destinations => WASQueue 條目下單擊 Add。
    • 在彈出 Add WASQueue 的窗口中:
      • 設置 Name 為“HWInboundQ”。
      • 設置 JNDI name 為“jms/HWQ”。
    • 單擊 OK。

      添加操作所得的 WASQueue 條目如圖 5 所示。

      圖 5.添加 WASQueue - HWInboundQ

  8. 在 Server Settings 窗口中,選擇 EJB 選項卡查看其他 EJB 容器設置中的偵聽器端口。
  9. 添加一個 JMS 偵聽器端口。
    • Server Settings => Listener Ports 下,單擊 Add。
    • 在彈出的 Add Listener Port 窗口中:
      • 設置 Name 為“HWPort”。
      • 向下滾動選擇 jms/HWQCF 作為連接工廠的 JNDI 名稱。
      • 向下滾動選擇 jms/HWQ 作為目的地的 JNDI 名稱。
    • 單擊 OK。

      添加操作所得的偵聽器端口條目如圖 6 所示。

      圖 6.添加 Listener Port - HWPort

  10. 在 Server Configuration 窗口中,選擇 Environment 選項卡查看 Environment Options。
  11. urlprotocols.jar 文件添加到服務器的類路徑中。
    • 在 Class Path 下單擊 Add External Jars。
    • 定位到<WSAD_INSTALLDIR>/runtimes/base_v51/lib 目錄。
    • 選擇文件 urlprotocols.jar。
    • 單擊 Open。

      要點:對于 SOAP/JMS,在 WebSphere Application Server V5.1 測試服務器的類路徑中必須包括 urlprotocols.jar 文件。這個文件包含測試應用程序必需的 JMS 協議處理類。

  12. 保存對 Server Configuration 的修改然后關閉編輯器。
    • 選擇 File => Save。
    • 如果有提示,單擊 Yes 合并對服務器配置的修改。
    • 關閉編輯器。

我們已經為 SOAP/JMS 成功配置了 WebSphere Application Server V5.1 測試環境。

步驟 3.為通過 JMS 傳輸 SOAP 創建一個無狀態會話 EJB Web 服務
在這一步里,我們使用 Application Developer 創建一個新的 EJB 模塊來將 SOAP/JMS 路由到無狀態會話 bean Web 服務的實現。然后使用工具創建 Web 服務實現本身。在步驟 4 中將為 SOAP/JMS 和 HTTP/JMS 修改 Web 服務實現。

Application Developer 在 EJB 模塊中創建消息驅動 Bean(MDB)。這個 EJB 模塊獨立于無狀態會話 bean Web 服務實現模塊。如果有必要,這個 MDB 會通過隊列來處理傳入消息、調用 Web 服務并發送響應消息。MDB 的創建是在 Application Developer 創建 Web 服務實現的過程中隱式地進行。但是,包含結果 MDB 的 EJB 模塊必須在為 SOAP/JMS 創建 Web 服務實現之前創建。

根據本教程的目的,我們將創建一個新的 EJB 模塊——HelloWorldJMSRouter,它將 SOAP/JMS 請求路由到 HelloWordSSB Web 服務實現。

  1. 在工作區中打開 J2EE Perspective。
  2. 創建 JMS Router Module。
    • 在 Project Navigator 視圖中,右鍵單擊 HelloWorld Enterprise Application。
    • 選擇 New => Other。
    • 在新彈出窗口的左側欄中單擊 EJB。
    • 在新彈出窗口的右側欄中單擊 EJB Project。
    • 單擊 Next。
    • 選擇 Create 2.0 EJB Project bullet (缺省地被選中)。
    • 單擊 Next。
    • 輸入“HelloWorldJMSRouter”作為 Project name。
    • 單擊 Finish。
    • 如果有提示,單擊 OK 修改服務器配置并向 Server Configuration 中添加 Router Module。
  3. 為 HelloWorld 無狀態會話 Bean 創建 EJB Web 服務。
    • 在 Project Navigator 視圖中。
    • 右鍵單擊 HelloWorldEJB EJB 模塊。
    • 選擇 New => Other。
    • 在新彈出窗口的左側欄中單擊 Web services。
    • 在新的彈出窗口右側欄格中單擊 Web service。
    • 單擊 Next。

      所得的新 XML Web 服務選項如圖 7 所示。

      圖 7.創建新的 XML Web 服務

  4. 在 Web services 窗口中:
    • 向下滾動選擇 EJB Web service 作為 Web service type。
    • 在 Web project 中取消 Start Web service。
    • 單擊 Next。

      所得的 Web 服務條目如圖 8 所示。

      圖 8.Web service - EJB Web service

  5. 在 Service Deployment Configuration 窗口中:
    • 檢查 Server 是否被設置為 TestServer,如果還沒有,選擇 Edit。
    • 選擇 Existing Servers => Test Server。
    • 單擊 OK。
    • 向下滾動 Router Project 然后選擇“HelloWorldJMSRouter”。
    • 單擊 Next。

      要點:如果使用的是 Application Developer V5.1 (為 WAS 5.0.2 開發的),它會在同一個 EJB 模塊中創建一個 MDB 作為無狀態會話 bean Web 服務實現。因此,不需要創建新的 EJB Project ,Router Project 會被設置為 HelloWordEJB。在 Application Developer V5.1 中啟用 SOAP/JMS 選項和創建 MDB 時必須這樣做,這個 MDB 可以通過 HelloWorldEJB Module 的隊列來處理傳入消息。

      所得的服務部署配置條目如圖 9 所示。

      Figure 9. Service deployment configuration - EJB Web service圖 9.服務部署配置 - EJB Web 服務

  6. 在 Web service EJB Selection 窗口中:
    • 單擊 Browse EJB beans。
    • 選擇無狀態 EJB Bean HelloWorldSSB。
    • 單擊 OK。
  7. 輸入 JMS URI Properties,該屬性被用作 JMS 服務端點 URL。這些屬性的大部分會自動填充。
    • 選擇 Soap over JMS。
    • 設置隊列的 JMS 目的地。
    • 向下滾動選擇 jms/HWQ 作為目標隊列或主題 JNDI 名稱(缺省選中)。
    • 向下滾動選擇 jms/HWQCF 作為 JMS Connection factor (缺省選中)。
    • 設置請求即將分派到的端口組件 Name 為“HWSSBPortComponent”。
    • 向下滾動選擇 HWPort 作為消息驅動 Bean 的偵聽器輸入端口的名稱(缺省選中)。
    • 單擊 Next。

      所得的 Web 服務 EJB 選項條目如圖 10 所示。

      圖 10.Web 服務 EJB 選項 - EJB Web 服務

  8. 在 Web service Java Bean Identity 上:
    • 單擊 Next 接受缺省設置。
    • 在為 WS-I compliance 彈出的 Web 服務警告窗口中單擊 Details 以瀏覽關于啟用 JMS 的警告。
    • 單擊 Ignore。(該警告是必然出現的。)
  9. 單擊 Finish。

步驟 4.a.修改 Web 服務部署描述符來為 Web 路由器模塊創建端口組件和綁定
在這一步,將為 SOAP/HTTP 傳輸訪問 HelloWorld Web 服務實現創建一個新的端口組件和綁定配置

  1. 在 J2EE Perspective Project Navigator 視圖 中:
    • 展開 HelloWorldEJB => ejbmodule => META-INF。
    • 雙擊 webservices.xml 打開 Web services Editor。
    • 為便于瀏覽,雙擊 Web services Editor 選項卡使編輯器最大化。
  2. 在 Web services Editor 窗口中,選擇 Port Components 選項卡,查看 Port Component 的設置。在 Port Components 下,單擊 Add 創建一個新的缺省的“Port component”。
  3. 高亮顯示新創建的端口組件。
    • 如果必要的話,向下滾動右側欄到 Port Component implementation details。
    • 設置 Port Component Name 為“HelloWorld”。
    • 對 WSDL Port 條目:
      • 設置 Namespace URI 為“http://ejb.webservices.test.ibm.com”。
      • 設置 Local part 為“HelloWorld”。
    • 設置 Service endpoint interface 為 com.ibm.test.webservices.ejb.HelloWorldSSB。
    • 選中 EJB Link 單選框。
    • 向下滾動然后選擇 HelloWorldSSB 作為 Service Implementation bean (缺省選中)。

    所得的端口組件條目如圖 11 所示:

    圖 11.Web 服務編輯器 - 端口組件。

  4. 在 Web services Editor 中,選擇 Bindings 選項卡以瀏覽 Web 服務綁定。
    • 在 Web service Description Bindings 部分高亮顯示 HelloWorldSSBService。
    • 如果有必要,在右側欄向下滾動到 Port Component Binding。
    • 單擊 Add。
  5. 在 Port Component binding 對話框窗口中:
    • 向下滾動選擇 HelloWorld 作為 PC Name Link。
    • 向下滾動并設置 Session 為 Scope。
    • 單擊 OK。

    所得的端口組件綁定對話框條目如圖 12 所示:

    圖 12.Web 服務編輯器 - 端口組件綁定對話框

  6. 保存所作的修改并關閉 Web services Editor。
    • 選擇 File => Save。
    • 關閉 Editor。
  7. 修改 ibm-webservices-bnd.xmi 文件中缺省的 pcBindings 配置信息。在 J2EE Perspective Project Navigator 視圖中:
    • 展開 HelloWorldEJB => ejbmodule => META-INF。
    • 雙擊 ibm-webservices-bnd.xmi 來打開 XML Editor。
    • 選擇 Source 選項卡。
    • 刪除安全綁定元素。

    原來的 pcBindings 條目:

    clearcase/" target="_blank" >cccccc border=1>
    
    <pcBindings xmi:id="PCBinding_1068756918823" pcNameLink="HelloWorld" 
          wsdlServiceQnameNamespaceLink="" wsdlServiceQnameLocalnameLink="" scope="Session">
       <securityRequestReceiverBindingConfig xmi:id="SecurityRequestReceiverBindingConfig_1068756918823"/>
       <securityResponseSenderBindingConfig xmi:id="SecurityResponseSenderBindingConfig_1068756918823"/>
    </pcBindings>
    

    修改后的 pcBindings 條目:

    
    <pcBindings xmi:id="PCBinding_1068756918823" pcNameLink="HelloWorld" 
       wsdlServiceQnameNamespaceLink="" wsdlServiceQnameLocalnameLink="" 
    scope="Session">
    
    *** 這里刪除了以下元素 ***
    </pcBindings>
    
  8. 保存修改并關閉 XML Editor。
    • 選擇 File => Save。
    • 關閉 Editor。

這些是 Web 服務部署描述符所需的全部修改。

步驟 4.b.使用必要的端口和綁定配置修改 Web Services Description Language(WSDL)文件
在這一步,將使用所需的端口和綁定定義來修改 HelloWorldSSB.wsdl 文件,以利于 SOAP/HTTP 對 HelloWorld Web 服務實現的請求。

  1. 在 J2EE Perspective Project Navigator 視圖中:
    • 展開 HelloWorldEJB => ejbmodule => META-INF => wsdl。
    • 雙擊 HelloWorldSSB.wsdl 打開 WSDL Editor。
    • 為便于瀏覽,雙擊 HelloWorldSSB.wsdl 選項卡使編輯器最大化。
    • 選擇 Graph 選項卡查看 Graphical WSDL 表示。
  2. 在 Services Section 中:
    • 右鍵單擊 HelloWorldSSBService service definition
    • 選擇 Add Child => port。
    • 在新彈出的 New Port 窗口中,設置 Name 為“HelloWorld”。
    • 單擊 OK。
  3. 在 Services Section 中:
    • 右鍵單擊 HelloWorld port definition。
    • 選擇 Set Binding。
    • 選擇 Create a new binding bullet。
    • 在彈出的 Specify Binding 窗口中,設置綁定 Name 為“HelloWorldSoapBinding”。
    • 單擊 Finish。

      所得的指定綁定條目如圖 13 所示。

      圖 13.WSDL 編輯器 - 端口定義指定綁定

  4. 在左下側框的 Port Definition 中,向下滾動,為 HelloWorld port 設置 intf:HelloWorldSoapBinding 作為 Binding。
  5. 在 Services Section 中:
    • 右鍵單擊 HelloWorld port definition。
    • 單擊 Set PortType。
    • 選擇 Select an existing Port Type bullet。
    • 選擇 intf:HelloWorldSSB Port Type。
    • 單擊 Finish。

      所得的指定端口類型條目如圖 14 所示。

      圖 14.WSDL 編輯器 - 端口定義指定端口類型

  6. 在 Services Section 中:
    • 右鍵單擊 HelloWorld port definition。
    • 選擇 Add Extensibility Element => wsdlsoap:address。
  7. 在 Services Section 中:
    • 展開 HelloWorld port definition。
    • 選擇前面創建的 wsdlsoap:address
  8. 在左下側框的 wsdlsoap:address 段中:
    • 單擊 Value field 中的第一條“http://www.ibm.com”進行編輯。
    • 將值設置為“http://localhost:9080/HelloWorldWebRouter/services/HelloWorld”。
    HelloWorldWebRouter 將是 Web Router Module 的上下文根,Web Router Module 將在步驟 4.c 中創建。
  9. 在 Web services Editor 中,選擇 Source 選項卡,查看 Source Editor。
  10. 從 HWSSBPortComponentSoapBinding 將 wsdlsoap:binding 和 wsdl:operation 的信息復制到 HelloWorldSoapBinding,如下所示:
    
    <wsdl:binding name="HWSSBPortComponentSoapBinding" type="intf:HelloWorldSSB">
    
       ***從這里開始復制元素****
    
    </wsdl:binding>
    
    <wsdl:binding name="HelloWorldSoapBinding" type="intf:HelloWorldSSB">
    	
       ***將復制的元素粘貼到這里***
    
    </wsdl:binding>
    
  11. 將 HelloWorldSoapBinding 中 wsdlsoap:binding 元素的傳輸元素由 JMS 更改為 HTTP,如下所示:
    
    <wsdl:binding name="HelloWorldSoapBinding" type="intf:HelloWorldSSB">
    
       <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/jms"/>
    	...
    </wsdl:binding>
    
  12. 保存對 HelloWorldSSB.wsdl 所作的修改并關閉 WSDL Editor。
    • 選擇 File => Save。
    • 關閉 Editor。

以上這些是對 SOAP/JMS 和 SOAP/HTTP 請求 HelloWorld Web 服務實現所需的 HelloWorldSSB.wsdl 文件所做的全部修改。

步驟 4.c.在 HTTP 路由器模塊上創建 SOAP
在這一步里,創建附加的 Web 路由器模塊來處理對 HelloWorld Web 服務實現的傳入 HTTP 請求。

  1. 在 J2EE Perspective Project Navigator 視圖中:
    • 右鍵單擊 HelloWorldEJB 項目。
    • 選擇 Web services => Endpoint Enabler。
    • 在 Select Transports 下,HTTP 缺省地被選中。
    • 設置 HTTP 路由器模塊的名稱為“HelloWorldWebRouter”。
    • 將與 HTTP 路由器模塊相關聯的上下文根設置為“HelloWorldWebRouter”。
    • 單擊 OK。該操作可能需要花費幾分鐘的時間。
    • 如果提示是否保存對 Server Configuration 所作的修改,單擊 OK。

      所得的端點啟用程序配置條目如圖 15 所示。

      圖 15.Web 服務端點啟用程序 - HTTP 路由器

HelloWorldWebRouter Web 模塊創建完成,開始處理 SOAP/HTTP 請求。

還可以選擇使用 endptEnabler 命令行工具來創建 HelloWorldWebRouter 模塊。 WebSphere Application Server 5.1 為開發 Web 服務實現提供了一個如同 Web 服務客戶機的命令行工具—— endptEnabler。endptEnabler 命令行工具提供一個便利的向支持 Web 服務的應用程序( EAR 文件 )添加一個或多個路由模塊的方法。每一個路由模塊都被創建并支持 JMS 或 HTTP 的 服務端點。例如,要創建如上所述的相同的 HTTP 端點,可以使用如下的命令行:

endptEnabler -properties mypropsfile.props HelloWorld.ear

本教程的屬性文件包含以下條目:


mypropsfile.props

HelloWorldEJB.transports=http
HelloWorldEJB.http.routerModuleName=HelloWorldWebRouter
HelloWorldEJB.http.contextRoot=/HelloWorldWebRouter

本教程并沒有詳細描述 endptEnabler 命令行工具。要獲取有關endptEnabler 和 命令行選項的詳細信息,請參閱 WebSphere Application Server Info Center。endptEnabler 應該在支持 Web 服務的應用程序部署之前就運行于 WebSphere Application Server 5.1。

步驟 5.從相應的 WSDL 生成 Web 服務客戶機
在這一步,將創建 Test Client 來測試我們的 Web 服務。

  1. 在 J2EE Perspective Project Navigator 中:
    • 右鍵單擊 HelloWorld 項目。
    • 選擇 New => Other。
    • 在新彈出窗口的左側欄中,單擊 Web services。
    • 在新彈出窗口的右側欄中,單擊 Web service Client。
    • 單擊 Next。
  2. 在 Web services 窗口中:
    • 選擇 Java Proxy 作為 Client proxy type(缺省選中)。
    • 選擇 Test Generated Proxy。
    • 單擊 Next。

    所得的 Web 服務客戶機選擇結果如圖 16 所示:

    圖 16.Web 服務客戶機代理配置

  3. 在 Client Environment Configuration 窗口中:
    • 選擇 Use Defaults bullet(缺省選中)。
    • 設置或輸入“HelloWorldWebJMSClient”作為 Client Web Project。
    • 單擊 Next。

    所得的 Web 服務客戶機條目如圖 17 所示:

    圖 17.Web 服務客戶機環境配置

  4. 在 Web service Selection Page 窗口中:
    • 選擇 Browse 來定位 HelloWorldSSB.wsdl 文件。
    • 選擇 HelloWorldEJB => ejbmodule => META-INF => wsdl => HelloWorldSSB.wsdl。
    • 單擊 OK。
    • 單擊 Next。
  5. 在 Web service Proxy Page 中:
    • 選擇 Generate Proxy (缺省選中)。
    • 單擊 Next。
  6. 在 Web service Client Test 窗口中:
    • 選擇 Test the generated proxy(缺省選中)。
    • 取消選中的“getHelloWorldSSB”和“useJNDI”方法(缺省選中)。
    • 取消選中的“Run test on Server”(缺省選中)。
    • 單擊 Finish。

      所得的 Web 服務客戶機測試條目如圖 18 所示。

      圖 18.Web 服務客戶機測試

我們已經成功的生成了一個 Web 服務測試客戶機,使用 SOAP/JMS 和 SOAP/HTTP 這兩種傳輸機制來調用 HelloWorld Web 服務實現。

步驟 6.為兩種傳輸方法測試 Web 服務客戶機

  1. 在 J2EE Perspective Project Navigator中:
    • 展開 HelloWorldWebJMSClient=>WebContent => sample => HelloWorldSSBProxy。
    • 右鍵單擊 TestClient.jsp。
  2. 選擇 Run on Server。
  3. 選擇 Use an existing Server bullet(缺省地被選中)。
  4. 從前面配置好的服務器列表中選擇 TestServer(缺省選中)。
  5. 單擊 Finish。將啟動 TestServer,打開 Web Browser 并調用 http://localhost:9080/HelloWorldWebJMSClient/sample/HelloWorldSSBProxy/TestClient.jsp。

    所得的服務器選擇條目如圖 19 所示。

    圖 19.Web 服務測試客戶機服務器選擇

  6. 雙擊 Web Browser 選項卡。最大化 Web Browser 以便于瀏覽。
  7. 在 Web Browser 中:
    • 在 Methods 框中單擊getEndpoint。
    • 在 Inputs 框中單擊 Invoke。

    調用 getEndPoint 操作所得結果如圖 20 所示。

    圖 20.Web 服務測試客戶機 getEndpoint 調用

    Result 框中包含著 JMS 端點 URL 字符串。

  8. 在 Web Browser 中:
    • 在 Methods 框中單擊 getMessage。
    • 在 Inputs 框中單擊 Invoke。

    在 Result 框中顯示“Hello World”信息。圖 21 顯示了調用測試客戶機 getMessage 操作所得的結果。

    圖 21.Hello World

接下來,測試在 HTTP 上使用 SOAP 的 Web 服務。

  1. 在 Web Browser 的 Methods 框中,單擊 setEndpoint(String)。
  2. 要在 HTTP 上使用 SOAP 調用 Web 服務,請在 Inputs 框的端點方框中輸入 http://localhost:9080/HelloWorldWebRouter/services/HelloWorld"。
  3. 在 Web Browser 中,單擊 Invoke。

    注意:要在 JMS 上使用 SOAP 調用 Web 服務,URL 應該設置為 jms:/queue?destination=jms/HWQ&connectionFactory=jms/HWQCF&targetService=HWSSBPortComponent"。

  4. 在 Web Browser 中:
    • 在 Methods 框中單擊 getEndpoint。
    • 在 Inputs 框中單擊 Invoke。
  5. 在 Result 框中包含 HTTP 端點的 URL。
  6. 在 Web Browser 中:
    • 在 Methods 框中單擊 getMessage。
    • 在 Inputs 框中單擊 Invoke。
  7. 在 Result 框中顯示“Hello World”信息。

我們已經成功的測試了 Web 服務實現和使用 SOAP/JMS 和 SOAP/HTTP 傳輸機制來調用 Web 服務的功能。

故障診斷提示和技巧
問題:

測試應用程序和初始化 TestClient.jsp 時,會發生如下的異常:


[11/12/03 15:40:20:535 EST] 2c057c0b WebGroup      
   E SRVE0026E: [Servlet Error]-[]: java.lang.NullPointerException
   at org.apache.jsp._Method._jspService(_Method.java:100)
   at com.ibm.ws.webcontainer.jsp.runtime.HttpJspBase.service(HttpJspBase.java:89)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
	....
	....

解答:

沒有把 urlprotocols.jar 文件添加到服務器類路徑。參見步驟 2.為通過 JMS 傳輸 SOAP 配置服務器的步驟 11。

問題:

生成 Web 服務時,彈出一個窗口顯示如下信息:“IWAB044E unable to get URL for project P/HelloWorldEJB”。

解答:

取消操作,關閉所有打開的編輯器和 Server Configuration 窗口。重新生成 Web 服務。如果問題依然存在,則工作區可能處于不一致狀態。請嘗試重新啟動 Application Developer V5.1.1。

問題:

啟動 HelloWorldEJB.jar 文件時,EJB 模塊啟動失敗或是在控制臺上紀錄如下錯誤信息:


[11/13/03 17:01:50:743 EST] 4194ef52 WSServerImpl  
E WSWS1013E: Error: Found illegal scope: binding file=, portComponentName=HelloWorld, scope=.
[11/13/03 17:01:51:484 EST] 4194ef52 WSServerImpl  
E WSWS1035E: Exception caught in createService: 
   context info: wsbFileName=META-INF/ibm-webservices-bnd.xmi
   implClassName=com.ibm.test.webservices.ejb.HelloWorldSSB 
   wsdlFileName=META-INF/wsdl/HelloWorld.wsdl 
   wsdlContext=<WorkSpaceDir>\HelloWorldEJB\ejbModule
   \WEB-INF\wsdl\HelloWorld.wsdl portComponentName=HelloWorld.
[11/13/03 17:01:52:175 EST] 4194ef52 WSServerImpl  
E WSWS1002E: Error processing web services deployment descriptor 
   for module: HelloWorldEJB.jar with error: com.ibm.ws.exception.
RuntimeError: WSWS1013E: Error: Found illegal scope: binding file=,
    portComponentName=HelloWorld, scope=.
   at com.ibm.ws.webservices.component.WSServerImpl.findPortBinding(WSServerImpl.java:679)
   at com.ibm.ws.webservices.component.WSServerImpl.createService(WSServerImpl.java:780)

[11/13/03 17:10:13:977 EST] 4e3735c8 WSServerImpl  
   E WSWS1035E: Exception caught in createService: 
   context info: wsbFileName=META-INF/ibm-webservices-bnd.xmi 
   implClassName=com.ibm.test.webservices.ejb.HelloWorldSSB 
   wsdlFileName=META-INF/wsdl/HelloWorldSSB.wsdl wsdlContext=<WorkSpaceDir>
   \HelloWorldEJB\ejbModule\WEB-INF\wsdl\HelloWorldSSB.wsdl portComponentName=HelloWorld.
[11/13/03 17:10:14:458 EST] 4e3735c8 WSServerImpl  
   E WSWS1002E: Error processing web services deployment descriptor for module: HelloWorldEJB.jar 
   with error: com.ibm.ws.exception.RuntimeError: 
   There is no deployment descriptor defined for HelloWorld RequestReceiver
   at com.ibm.ws.webservices.component.WSServerImpl.createRequestReceiverConfig(WSServerImpl.java:1131)
   at com.ibm.ws.webservices.component.WSServerImpl.createService(WSServerImpl.java:867)
   at com.ibm.ws.webservices.component.WSServerImpl.ejbMetaDataCreated(WSServerImpl.java:1448)
   at com.ibm.ws.webservices.component.WSServerImpl.metaDataCreated(WSServerImpl.java:391)

ibm-webservices-bnd.xmi 文件包含一個無效范圍或為端口組件 配置的缺省設置—— portComponentName=HelloWorld。檢查 HelloWorldEJB => ejbmodule => META-INF => ibm-webservices-bnd.xmi 文件中的如下條目:


<pcBindings xmi:id="PCBinding_1068756918823" pcNameLink="HelloWorld" 
   wsdlServiceQnameNamespaceLink="" wsdlServiceQnameLocalnameLink="" scope="">
      <securityRequestReceiverBindingConfig 
         xmi:id="SecurityRequestReceiverBindingConfig_1068756918823"/>
      <securityResponseSenderBindingConfig 
         xmi:id="SecurityResponseSenderBindingConfig_1068756918823"/>
</pcBindings>

解答:

刪除安全綁定元素并用下面修改過的條目替換上面的相應條目。參閱步驟 4.a.修改 Web 服務的部署描述符來為 Web 路由模塊創建端口組件和綁定中的步驟 7。


<pcBindings xmi:id="PCBinding_1068756918823" pcNameLink="HelloWorld" 
   wsdlServiceQnameNamespaceLink="" wsdlServiceQnameLocalnameLink="" scope="Session">
</pcBindings>

問題:

為 JMS URL 設置端點時, setEndpoint 函數將 URL 修改為無效的 JMS URL。調用 getMessage 操作時,引發如下錯誤:


WSWS3013E: The JMS endpoint URL is missing one or more of the following required properties: 
   connectionFactory, destination, targetService

例如,設置 endPointURL 為:


jms:/queue?destination=jms/HWQ&connectionFactory=jms/HWQCF&targetService=HWSSBPortComponent

端點被錯誤的設置為:


jms:/queue?destination=jms/HWQ&amp;connectionFactory=jms/HWQCF&amp;targetService=HWSSBPortComponent

在生成的客戶機代碼里,檢查 Result.jsp 文件中的 markup 方法,該方法是否修改了傳遞到 setEndpoint(String) 的字符串并且將字符串中出現的 '&' 全部替換為"&amp;" ,如下面的代碼段所示:

清單 1.測試客戶機代碼
		

public static String markup(String text) {
   if (text == null) {
       return null;
   }

   StringBuffer buffer = new StringBuffer();
   for (int i = 0; i < text.length(); i++) {
       char c = text.charAt(i);
       switch (c) {
           case '<':
               buffer.append("<");
               break;
           case '&':
               buffer.append("&amp;");
               break;
           case '>':
               buffer.append(">");
               break;
           case '"':
               buffer.append(""");
               break;
           default:
               buffer.append(c);
               break;
       }
   }
   return buffer.toString();
}

解答:

修改客戶機代碼,以使 JMS URL 設置正確并且當將端點設置到 JMS URL 時不會發生錯誤??梢孕薷拇a,將 buffer.append("&amp;"); 替換為 buffer.append('&'); ,或者刪除 case '&': 子句,還可以注釋掉相關的代碼,如下所示:

清單 2.修改后的測試客戶機代碼

			
public static String markup(String text) {
   if (text == null) {
       return null;
   }

   StringBuffer buffer = new StringBuffer();
   for (int i = 0; i < text.length(); i++) {
       char c = text.charAt(i);
       switch (c) {
           case '<':
               buffer.append("<");
               break;
           /*Comment this section out for JMS URLs*/
           //case '&':
           //    buffer.append("&amp;");
           //    break;
           case '>':
               buffer.append(">");
               break;
           case '"':
               buffer.append(""");
               break;
           default:
               buffer.append(c);
               break;
       }
   }
   return buffer.toString();
}

修改代碼后,就可以通過改變端點來實現在 JMS 和 HTTP 端點 URL 之間的替換。

結束語
本教程演示了如何使用 Application Developer V5.1.1 和 WebSphere Application Server 5.1 Test Environment 來開發和測試一個名為 HelloWorld 的服務實現,該服務通過 SOAP/JMS 和 SOAP/HTTP 傳輸無狀態 Bean。Application Developer 縮短了通過 JMS 和 HTTP 傳輸機制實現對 SOAP 的支持所需的時間。

參考資料

  • Web services for J2EE, V1.0 [JSR-109]

  • Java API for XML-Based RPC (JAX-RPC) [JSR-101]

  • 使用 WebSphere V5 工具和技術開發和部署 Web 服務——第 1 部分:創建和測試 Web 服務

  • 在 WebSphere Studio Application Developer V5.1 中為 J2EE Web 服務提供支持——第 1 部分:服務器環境

  • IBM 紅皮書:WebSphere V5.1 Application Developer V5.1.1 Web 服務手冊

  • WebSphere Application Server 信息中心

關于作者
 Tendai Chinoda 的照片Tendai Chinoda 是 IBM Business Partner Technical Support WebSphere Competency Center 的軟件工程師。為 IBM WebSphere 家族產品的首要商業伙伴(Business Partners) 提供開發者到開發者(developer-to-developer) 的技術支持和啟動服務。Tendai 通過了 Application Developer V5.1 的 IBM Certified Solution Developer- Web Services Development、 WebSphere Application Server AE V4 的 IBM Certified Systems Expert- Administration 、IBM Certified System Administrator-WebSphere Application Server V 以及 Sun Certified Programmer-Java 2 Platform 等認證。他的專長和興趣包括 WebSphere Application Server V4 and V5 系統管理和體系結構、 WebSphere Studio Application Developer V5 J2EE、 Web 服務開發、WSDL、SOAP、JMS、JCA和JDBC等??梢酝ㄟ^ tendai@us.ibm.com 與 Tendai 聯系。


到頁首
下載
描述 文件類型 文件大小 下載方式
HelloWorldApp.zip zip 126 KB HTTPHTTP 下載

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97