Matthew Wilson 和 Katherine Sanders 2011 年 10 月 13 日發(fā)布
使用 Validator for WS-Policy in Eclipse本節(jié)闡述如何使用 Validator for WS-Policy in
Eclipse 調試無效 WS-Policy 導致的錯誤。這會使用到本文包含的樣例應用程序,還要使用 IBM? Rational? Application Developer 8.0.2 和 IBM WebSphere? Application Server 7.0.0.17。 設置 IBM WebSphere Application Server 和 IBM Rational Application
Developer要識別測試項目錯誤時將用到的運行時環(huán)境,則必須在 IBM Rational Application Developer 中創(chuàng)建一個服務器。這將創(chuàng)建一個從工作臺到現(xiàn)有應用服務器安裝或服務器配置文件的指針。在本文中,IBM WebSphere Application Server 7.0.0.17 安裝將用作樣例應用程序的應用服務器。但是,在創(chuàng)建這個服務器之前,還必須創(chuàng)建合適的 Server Runtime Environment 和 IBM WebSphere Application Profile,如果它們還不存在的話。最后,必須啟動服務器,準備好安裝和啟動應用程序。 使用一個新工作空間中啟動 IBM Rational Application Developer 8.0.2。 關閉 Welcome 頁。您現(xiàn)在應該位于 Java? EE 透視圖中。 創(chuàng)建一個 Server Runtime Environment:選擇 Window > Preferences Server / Runtime Environments > Add
圖 1. 添加一個 Server Runtime Environment 選擇 "WebSphere Application Server v7.0" > Next
圖 2. 選擇 Runtime Environment 的類型 名稱 = "WebSphere Application Server v7.0.0.17",安裝目錄 =
<WAS_HOME>(例如, C:\Program Files\IBM\WebSphere\AppServer)> Finish
圖 3. 指定 IBM WebSphere Application Server 安裝目錄 創(chuàng)建一個 IBM WebSphere Application Server Profile:選擇 Window > Preferences Server / WebSphere Application Server > Run Profile Management Tool
圖 4. 運行 Profile Management Tool 在打開 Profile Management Tool 之后,單擊 Launch Profile Management Tool。
圖 5. 啟動 Profile Management Tool 單擊 Create...
圖 6. 新建一個配置文件 確保已選中 "Application Server" > Next
圖 7. 指定要創(chuàng)建的環(huán)境的類型 確保已選中 "Typical profile creation" > Next
圖 8. 選擇 Typical profile creation 流程 取消選中 "Enable administrative security" 復選框 > Next。
圖 9. 禁用管理安全性 檢查配置文件細節(jié) > Next
圖 10. 檢查配置文件創(chuàng)建摘要 配置文件創(chuàng)建后,取消選中 "Launch the First steps console" 復選框 > Finish。
圖 11. 完成配置文件創(chuàng)建向導 關閉 Profile Management Tool。 檢查新配置文件現(xiàn)在是否已在底部面板中列出。然后單擊 OK 關閉 Preferences 窗口。
創(chuàng)建并啟動一個服務器Servers 選項卡 > 右鍵單擊 > New > Server。
圖 12. 新建一個服務器 選擇 "WebSphere Application Server v7.0" > Next。
圖 13. 選擇服務器類型 確保選擇剛剛創(chuàng)建的配置文件的名稱 > Finish。
圖 14. IBM WebSphere Application Server 設置 Servers 選項卡 > 右鍵單擊 "WebSphere Application Server v7.0.0.17 at localhost" > start。
圖 15. 啟動服務器 導入并運行樣例應用程序樣例應用程序使用了一個 Policy Set,默認情況下,IBM WebSphere
Application Server 和 IBM Rational Application Developer 中沒有安裝它,因此必須先導入它。然后,可以將樣例應用程序 EAR 文件導入 IBM Rational Application Developer 工作空間,并在上一節(jié)中創(chuàng)建的服務器上啟動它。應用程序運行后,就可用于發(fā)送一個同步 Web 服務請求。但是,這將產生一個異常,而不是返回一條成功響應消息,因為樣例應用程序中的 WS-Policy 是無效的。 將樣例應用程序所需的提供者策略集導入 IBM WebSphere Application Server:選擇 Servers 選項卡 > 右鍵單擊 "WebSphere Application Server v7.0.0.17 at localhost" > Administration > Run Administrative Console...
圖 16. 運行 Administrative Console Administrative Console > Services / Policy Sets / Application Policy Sets > Import... > From default repository...
圖 17. 導入 Policy Set 滾動到頁面底部,單擊箭頭移動到第 2 頁。 選中 "WS-Security default" 旁邊的復選框 > OK > Save。
圖 18. 選擇 WS-Security 默認 Policy Set 退出并關閉 Administrative Console。 將樣例應用程序所需的提供者策略集導入 IBM Rational
Application Developer 并下載本文包含的 WSSecurity default.zip 文件。 在 Enterprise Explorer 視圖中右鍵單擊 > Import > Import...
圖 19. 打開導入向導 Web services / WebSphere Policy Sets > Next
圖 20. 導入 Policy Set 瀏覽導入的文件 > Finish
圖 21. 導入下載的 Policy Set 導入已破壞的樣例應用程序并下載本文包含的 InvalidPolicy.ear 文件。 右鍵單擊 Enterprise Explorer > Import > EAR File。
圖 22. 導入一個 EAR 文件 瀏覽您下載的文件,確認目標運行庫 = "WebSphere Application Server v7.0.0.17" > Finish
圖 23. 導入下載的 EAR 文件 注意,使用 IBM Rational Application Developer 附帶的默認插件時,樣例應用程序的編譯沒有錯誤。
圖 24. 導入的樣例應用程序編譯沒有錯誤 運行已破壞的樣例應用程序并選擇 Servers 選項卡 > 右鍵單擊 "WebSphere Application Server v7.0.0.17 at localhost" > Add and Remove...
圖 25. 打開 Add and Remove 向導 選擇 Available 列中的 InvalidPolicy > Add > Finish
圖 26. 添加已破壞的樣例應用程序 應用程序成功發(fā)布后,請注意,服務器狀態(tài)已經更改為 [Started, Synchronized]。
圖 27. 檢查服務器狀態(tài) 打開一個 Web 瀏覽器,導航到 http://<WAS_HOST>:<WAS_PORT>/wssamplesei/demo,例如 http://localhost:9080/wssamplesei/demo。 選擇 Message Type = Synchronous Echo, Message String = hello > Send Message。一個異常會出現(xiàn)。
圖 28. 調用已破壞的樣例應用程序 Web 服務 分析錯誤并定位無效 WS-Policy當 Server Runtime Environment 中出現(xiàn)錯誤時,錯誤日志會顯示在 IBM Rational Application Developer 中的控制臺視圖中。在本例中,將有一個錯誤指出客戶端上的 WS-Security 配置中有問題,需要確定客戶端是否是使用提供者 WSDL 文檔中的 WS-Policy 配置的。 查看 IBM Rational Application Developer 中的控制臺并觀察下面的消息:
清單 1. 運行已破壞的樣例應用程序后的錯誤1 2 3 4 5 6 | [23/05/11 14:40:12:906 BST] 0000001f SystemOut O >> CLIENT: ERROR: SEI Echo EXCEPTION.
[23/05/11 14:40:12:906 BST] 0000001f SystemErr R javax.xml.ws.WebServiceException:
com.ibm.wsspi.wssecurity.core.SoapSecurityException: CWWSS5400E: algorithm attribute is
required but found:
com.ibm.ws.wssecurity.confimpl.PrivateCommonConfig$AlgorithmConfImpl(algorithm=[null],
type=[null], properties=[{}]).
|
注意,生成策略集配置時,客戶端上出現(xiàn)了錯誤:
清單 2. 錯誤堆棧跟蹤1 2 3 | [23/05/11 14:40:12:921 BST] 0000001f SystemErr R at
com.ibm.ws.wspolicy.runtime.handler.ClientWSPolicyHandlerImpl.
generatePolicySetConfigurations(ClientWSPolicyHandlerImpl.java:282)
|
注意,Web 服務客戶端被配置為使用提供者策略。 選擇 Services 視圖 > JAX-WS/Clients/SampleClientSei: {http://com/ibm/was/wssample/sei/echo/}EchoService > Manage Policy Set Attachment...
圖 29. 管理客戶端 Policy Set 附件 注意,所有服務都被設置為 "Acquire Provider Policy"。
圖 30. 查看每個服務的策略獲取 單擊 "Use Provider Policy...",觀察是否使用 HTTP GET 從默認 WSDL URL 中獲取策略。
圖 31. 查看提供者策略 WSDL URL 定位包含提供者策略的 WSDL 文件并導航到 http://<WAS_HOST>:<WAS_PORT>/WSSampleSei/EchoService?wsdl,例如 http://localhost:9080/WSSampleSei/EchoService?wsdl。 注意,這個 URL 重定向到 http://<WAS_HOST>:<WAS_PORT>/WSSampleSei/EchoService/WEB-INF/wsdl/Echo.wsdl,這是因為正在使用的 WSDL 是提供者 WAR 中的一個已打包的文件(InvalidPolicy/SampleServicesSei/WebContent/WEB-INF/wsdl/Echo.wsdl)。
圖 32. 定位 Echo.wsdl 文件 安裝 Validator for WS-Policy in Eclipse 插件由于已經確認提供者 WSDL 文檔中的 WS-Policy 有問題,但 Eclipse 中的現(xiàn)有驗證器沒有發(fā)現(xiàn)原因所在,因此將安裝 Validator for WS-Policy in Eclipse 插件。安裝將通過其他 Eclipse 插件使用的標準更新機制來完成。 從 alphaWorks 下載 VWPE.zip,這個 Zip 文件包含 Validator for WS-Policy in Eclipse 1.0。 在一個本地目錄中解壓 VWPE.zip,在指定目錄中創(chuàng)建一個本地更新站點。 Help > Install New Software... 單擊 Add...
圖 33. 新增一個存儲庫 單擊 Local...,選擇前面解壓的 VWPE 目錄。
圖 34. 選擇 VWPE 目錄 輸入 Name VWPE 并單擊 OK。 選擇 Validator for WS-Policy in Eclipse 插件并單擊 Next。
圖 35. 選擇要安裝的插件 檢查安裝細節(jié)并單擊 Next。
圖 36. 檢查要安裝的項目 檢查并接受許可,單擊 Finish。
圖 37. 檢查許可 單擊 OK 忽略安全警告。
圖 38. 忽略安全警告 安裝完成后,單擊 Restart Now 重啟帶有新插件的 IBM Rational Application Developer。
圖 39. 重啟 IBM Rational Application Developer 配置 Validator for WS-Policy in Eclipse要驗證是否已經正確安裝該插件,則應該檢查配置,確保驗證器已經啟用并且會在 WSDL 文檔上運行。 重啟 IBM Rational Application Developer 后,請轉到 Window > Preferences。 Validation > 確保 WS-Policy 驗證器已經啟用("Manual" 和 "Build" 復選框均已選中)。
圖 40. 確保已啟用 WS-Policy 驗證器 單擊 "WS-Policy validator" 旁邊的 "..." 按鈕打開 Settings。 檢查 WS-Policy Validator 是否會在所有擴展名為 wsdl 和 xml 的文件上運行。單擊 Cancel。
圖 41. 驗證器使用的文件類型 Validation / WS Policy Validator。注意,這個子頁允許使用自定義架構文件。默認情況下,這個架構目錄是空的,以便使用插件提供的架構。下面的 “測試架構” 將詳細介紹相關內容。
圖 42. WS Policy Validator 架構目錄 驗證已破壞的樣例應用程序中的無效 WS-Policy項目中的所有文件都將將獲得驗證,提供者 WSDL 文檔中會出現(xiàn)一個 WS-Policy 錯誤,此前將該文檔標識為客戶端配置錯誤的根源??梢允褂靡粋€標記來標識無效的特定 WS-Policy 斷言,錯誤消息會說明有一個斷言缺失??梢允褂靡?guī)范和提供者配置作為指導,通過添加缺失的斷言來解決這個問題。 圖 43. 驗證 WS-Policy 驗證結束時,單擊 OK 關閉 Validation Results 對話框。
圖 44. 驗證結果 注意,會有一個新的 Invalid WS-Policy 錯誤出現(xiàn)在 Markers 選項卡中。該錯誤指出 AlgorithmSuite 斷言至少必須出現(xiàn)一次。
圖 45. Markers 選項卡中的 Invalid WS-Policy 錯誤 雙擊錯誤會打開 InvalidPolicy/SampleServicesSei/WebContent/WEB-INF/wsdl/Echo.wsdl 文件,并會突出顯示相關的行。注意,這是我們前面指出的那個文件。它包含 Web 服務提供者發(fā)布的 WS-Policy,客戶端正在使用這個提供者策略來配置自己。 注意,錯誤位于一個 AsymmetricBinding 斷言中。
圖 46. 無效 AsymmetricBinding 斷言 注意 WS-Security
Policy 1.2 規(guī)范 中的 AsymmetricBinding 斷言的語法。正如錯誤中說明的那樣,AlgorithmSuite 是必需的,但它缺少以下內容:
清單 3. AsymmetricBinding 斷言語法1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <sp:AsymmetricBinding xmlns:sp="..." ... >
<wsp:Policy xmlns:wsp="...">
(
<sp:InitiatorToken>
<wsp:Policy> ... </wsp:Policy>
</sp:InitiatorToken>
) | (
<sp:InitiatorSignatureToken>
<wsp:Policy> ... </wsp:Policy>
</sp:InitiatorSignatureToken>
<sp:InitiatorEncryptionToken>
<wsp:Policy> ... </wsp:Policy>
</sp:InitiatorEncryptionToken>
)
(
<sp:RecipientToken>
<wsp:Policy> ... </wsp:Policy>
</sp:RecipientToken>
) | (
<sp:RecipientSignatureToken>
<wsp:Policy> ... </wsp:Policy>
</sp:RecipientSignatureToken>
<sp:RecipientEncryptionToken>
<wsp:Policy> ... </wsp:Policy>
</sp:RecipientEncryptionToken>
)
<sp:AlgorithmSuite ... => ... </sp:AlgorithmSuite>
<sp:Layout ... => ... </sp:Layout> ?
<sp:IncludeTimestamp ... /> ?
<sp:EncryptBeforeSigning ... /> ?
<sp:EncryptSignature ... /> ?
<sp:ProtectTokens ... /> ?
<sp:OnlySignEntireHeadersAndBody ... /> ?
...
</wsp:Policy>
...
</sp:AsymmetricBinding>
|
注意 AlgorithmSuite
Assertion 的語法:
清單 4. AlgorithmSuite Assertion 的語法1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <sp:AlgorithmSuite xmlns:sp="..." ... >
<wsp:Policy xmlns:wsp="...">
(<sp:Basic256 ... /> |
<sp:Basic192 ... /> |
<sp:Basic128 ... /> |
<sp:TripleDes ... /> |
<sp:Basic256Rsa15 ... /> |
<sp:Basic192Rsa15 ... /> |
<sp:Basic128Rsa15 ... /> |
<sp:TripleDesRsa15 ... /> |
<sp:Basic256Sha256 ... /> |
<sp:Basic192Sha256 ... /> |
<sp:Basic128Sha256 ... /> |
<sp:TripleDesSha256 ... /> |
<sp:Basic256Sha256Rsa15 ... /> |
<sp:Basic192Sha256Rsa15 ... /> |
<sp:Basic128Sha256Rsa15 ... /> |
<sp:TripleDesSha256Rsa15 ... /> |
...)
<sp:InclusiveC14N ... /> ?
<sp:SOAPNormalization10 ... /> ?
<sp:STRTransform10 ... /> ?
(<sp:XPath10 ... /> |
<sp:XPathFilter20 ... /> |
<sp:AbsXPath ... /> |
...)?
...
</wsp:Policy>
...
</sp:AlgorithmSuite>
|
Servers 選項卡 > 右鍵單擊 "WebSphere Application Server v7.0.0.17 at localhost"
> Administration > Run Administrative Console... Services / Policy sets / Application policy sets > WS-Security default
圖 47. WS-Security 的默認策略 單擊 WS-Security
圖 48. WS-Security 策略 單擊 Main Policy
圖 49. Main policy 單擊 Algorithms for asymmetric tokens。注意,提供者正在使用 Basic128Rsa15。
圖 50. Algorithms 退出并關閉 Administrative Console。 將以下 WS-Policy 斷言添加到 Echo.wsdl 中,以便使用 Basic128Rsa15 斷言(在 Layout 斷言上面的 AsymmetricBinding/Policy 斷言中):
清單 5. 樣例應用程序的 Algorithm Suite 策略1 2 3 4 5 | <ns2:AlgorithmSuite>
<wsp:Policy>
<ns2:Basic128Rsa15 />
</wsp:Policy>
</ns2:AlgorithmSuite>
|
保存更改。注意,Invalid WS-Policy 錯誤消失了。
重新運行修改后的樣例應用程序要使 WS-Policy 更改在客戶端配置上生效,必須重啟服務器。應用程序重新運行后,會發(fā)送另一個 Web 服務請求,這次會收到一條成功響應消息。WS-Security 配置錯誤不會再出現(xiàn)在控制臺日志中。 Servers 選項卡 > 右鍵單擊 "WebSphere Application Server v7.0.0.17 at localhost" > Restart。這可以確保重新創(chuàng)建的是客戶端策略集,而不是使用前面的無效配置的緩存副本。
圖 51. 重啟服務器 導航到 http://<WAS_HOST>:<WAS_PORT>/WSSampleSei/EchoService?wsdl,例如 http://localhost:9080/WSSampleSei/EchoService?wsdl,確保 WSDL 已經刷新,AlgorithmSuite 斷言存在。 導航到 http://<WAS_HOST>:<WAS_PORT>/wssamplesei/demo,例如 http://localhost:9080/wssamplesei/demo。 選擇 Message Type = Synchronous Echo, Message String = hello > Send Message。 響應成功返回,字符串 hello 返回。
圖 52. 調用修改后的樣例應用程序 Web 服務 注意,這個錯誤不再出現(xiàn)在控制臺記錄中。
總結樣例應用程序在提供者 WSDL 文檔中包含無效 WS-Policy。由于客戶端被配置為讀取 WS-Policy 并使用它配置客戶端的 WS-Security 設置,因此 Web 服務調用會失敗。 要調試這個失敗,請檢查控制臺中的日志中的錯誤。日志中顯示的一個錯誤表明問題出現(xiàn)在客戶端策略集配置中??蛻舳吮慌渲脼槭褂脕碜?WSDL 文檔的提供者策略,這意味著 WS-Policy 存在無效的可能性。 安裝 Validator for WS-Policy in Eclipse 插件后,要驗證項目中的所有文件。唯一的錯誤出現(xiàn)在提供者的 WSDL 文件中,錯誤指出缺少一個 AlgorithmSuite 斷言。當打開文件時,錯誤標記也會指出 Assymmetric 綁定斷言中缺失 AlgorithmSuite 斷言。 為修復此錯誤,我們添加了與提供者的配置相對應的 AlgortithmSuite 斷言。這個插件提供的文檔還包含更多 WS-Policy 驗證錯誤示例,并介紹了如何修復這些錯誤。 提供者的 WSDL 文檔中的 WS-Policy 的長度超過 100 行,沒有一個標準 Eclipse 驗證器能夠識別其中的錯誤。而且,WS-Security Policy 非常復雜,因此手動驗證每個斷言非常耗時,而且手動驗證很容易出錯。顯然,如果沒有 Validator for WS-Policy in Eclipse,這個小錯誤將花費大量時間和精力才能得以解決。 創(chuàng)建自己的架構Validator for WS-Policy in Eclipse 由一些現(xiàn)有的架構提供,這些架構可用于支持 IBM WebSphere Application Server 7.0 的所有 WS-Policy 斷言。但是,可以通過其他規(guī)范使用的用戶定義架構來擴展該插件。例如,您可能想在您的 WSDL 中包含一些 WS-Policy 斷言,供另一個平臺上的端點使用。本節(jié)將展示如何為 Validator for WS-Policy in Eclipse 構造一個支持 WS-Eventing 規(guī)范 的架構。 WS-Eventing 描述了使用 Web 服務在另一個 Web 服務或應用程序中注冊您感興趣的活動的方法。它描述了允許服務管理其事件相關訂閱的訂閱管理器。為了表明對 WS-Eventing 的支持,指定了兩個 WS-Policy 斷言。EventSource 斷言用于表明服務接受創(chuàng)建訂閱的請求,SubscriptionManager 斷言表明服務支持代表其他服務管理訂閱。這兩個斷言的結構都比較簡單,因此可以作為展示如何創(chuàng)建架構的簡單示例。驗證器的架構文件的格式是經過預先設計的,以便從一個正式規(guī)范創(chuàng)建架構成為一個簡單任務。因此,這種格式主要基于 WS-Security Policy 等 OASIS 規(guī)范中使用的語法慣例。但是,驗證器的確需要向這個語法信息添加一些額外的元數(shù)據(jù)并對其結構實施一些限制。架構文件被劃分為很多部分,每個部分都以一個位于方括號中的標題開頭。 前兩個部分關注與規(guī)范有關的 XML 命名空間。第一個部分是 [Namespaces],它列示架構中使用的命名空間前綴及其對應的經過限定的命名空間,類似于基本 XML 文檔中的 xmlns 屬性。注意,與 xmlns 不同,使用的每個命名空間都必須通過其前綴進行聲明,并在架構的其余部分通過前綴引用;不支持使用完全限定的斷言。對于 WS-Eventing,我們只關心一個命名空間,即 WS-Eventing 命名空間;在規(guī)范的 3.5 節(jié) 中提供了這個命名空間,它使用了前綴 wse。我們將這部分編碼如下: 清單 6. 架構的命名空間部分1 2 3 4 | [Namespaces]
<
wse = "http://www./2011/03/ws-evt"
>
|
我們還必須在 [PolicyNamespaces] 部分中指定規(guī)范支持的 WS-Policy 規(guī)范的版本。這允許驗證器驗證斷言中嵌入的 WS-Policy 是否使用正確的規(guī)范版本,并對 WS-Policy 斷言的屬性使用正確的驗證(WS-Policy 1.2 和 1.5 之間有區(qū)別)。WS-Eventing 規(guī)范只提到 WS-Policy 1.5,因此我們將這個部分編碼如下: 清單 7. 架構的 PolicyNamespace 部分1 2 3 4 | [PolicyNamespaces]
<
"http://www./ns/ws-policy"
>
|
架構的其余部分關注斷言本身。每個頂級斷言都應該在一個單獨的 [Syntax] 部分中描述。這些部分的語法非常類似于 Web 服務規(guī)范中使用的語法,通??梢詮哪切┎糠诌M行輕松修改。對于在幾個頂級斷言中包含重復斷言片段的規(guī)范,可以在 [Referenced] 部分中包含這些片段。但是,WS-Eventing 規(guī)范不需要這種設置。 為創(chuàng)建 EventSource 斷言的 [Syntax] 部分,我們要先復制規(guī)范的 9.1 節(jié) 中展示的語法,如下所示: 清單 8. 規(guī)范中展示的 EventSource 斷言的語法1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <wse:EventSource ...>
<wse:FilterDialect URI="xs:anyURI" ...>
xs:any*
</wse:FilterDialect> *
<wse:FormatName URI="xs:anyURI" ...>
xs:any*
</wse:FormatName> *
<wse:DateTimeSupported .../> ?
<wse:Expires min="xs:duration"? max="xs:duration"?.../> ?
<wse:EndToSupported .../> ?
<wse:NotificationPolicy ...>
xs:any
</wse:NotificationPolicy> ?
xs:any*
</wse:EventSource>
|
然后,我們需要進行以下修改,以便使其遵守驗證器支持的架構格式: 在 <wse:EventSource
...> 之后添加基數(shù)指示符 ?,指出頂級斷言在策略中不是必需的。如果不這樣做,驗證器會期望在其驗證的每個策略中找到這個斷言。 移動基數(shù)指示符,使其出現(xiàn)在 <wse:FilterDialect>、<wse:FormatName> 和 <wse:NotificationPolicy> 的起始標記而不是結束標記之后。 從標記集合中移除 xs:any*。通過閱讀規(guī)范中給出的描述,我們發(fā)現(xiàn)這些標記旨在表明元素的可擴展性,因此我們使用省略號...替代它們。 替換為 Expires 斷言的屬性提供的 xs:duration 類型,因為驗證器不支持該類型。xs:unsignedLong 是一個合適的替代類型。
修改后的語法如下所示: 清單 9. 架構中將包含的 EventSource 斷言的經過修改的語法1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [Syntax]
<wse:EventSource ...>?
<wse:FilterDialect URI="xs:anyURI" ...>*
...
</wse:FilterDialect>
<wse:FormatName URI="xs:anyURI" ...>*
...
</wse:FormatName>
<wse:DateTimeSupported .../> ?
<wse:Expires min="xs:unsignedLong"? max="xs:unsignedLong"?.../> ?
<wse:EndToSupported .../> ?
<wse:NotificationPolicy ...> ?
...
</wse:NotificationPolicy>
...
</wse:EventSource>
|
還必須針對 SubscriptionManager 斷言創(chuàng)建一個 [Syntax] 部分,這可以通過應用上面的規(guī)則來完成。這些規(guī)則普遍適用于以這種形式提供語法的架構。現(xiàn)在就完成了我們的架構;完成的文件作為一個下載本文提供。 測試架構創(chuàng)建支持 WS-Eventing 的架構后,現(xiàn)在可以使用安裝了 Validator for WS-Policy in Eclipse 的 IBM Rational Application Developer 來測試它。驗證器將默認情況下會使用 Eclipse 插件 jar 中分發(fā)的架構文件。要使用您自己的架構文件,則必須將驗證器配置為指向從中讀取架構文件的目錄: Window > Preferences 從列表中選擇 WS-Policy Validator。 單擊首選項頁上的瀏覽按鈕,選擇一個目錄。然后,驗證器將讀取選中目錄中所有擴展名為 .schema 的文件。刪除這個字段的內容會導致驗證器再次使用默認位置。 如果您想將您自己的架構添加到驗證器提供的架構中,請將驗證器分發(fā)的 .schema 文件復制到您配置的目錄中。這些文件可以從插件 jar 文件中的架構文件夾提取。 重啟 IBM Rational Application Developer 使更改生效。
圖 53. 配置驗證器使用的架構目錄 現(xiàn)在我們創(chuàng)建一些 WS-Policy 來進行驗證: 切換到 Resource 透視圖。 File > New... > Project 在 New Project 對話框中選擇 General > Project。然后單擊 Next。 輸入一個項目名稱并單擊 Finish。 File > New > File 選擇您的項目并輸入一個合適的文件名,例如 policy.xml。 向您的文件添加一些策略。下面的策略應該夠用:
清單 10. 測試架構的基本策略1 2 3 4 5 6 7 8 9 10 11 | <wsp:Policy xmlns:wsp="http://schemas./ws/2004/09/policy"
xmlns:wse="http://www./2011/03/ws-evt"
xmlns:test="http://www.ibm.com/websphere/policy/blueop/testing">
<wse:EventSource ...>
<wse:FormatName URI="...">
<mex:Location
Type="wsdl:definitions"
URI="http:///Notif_WSDL_Metadata" />
</wse:FormatName>
</wse:EventSource>
</wsp:Policy>
|
如果架構正確,則不會出現(xiàn)驗證錯誤。您將看到一個關于 mex:Location 元素的警告,因為該元素不是架構的一部分。 圖 54. WS-Eventing 斷言的正確驗證 要確保驗證正在工作,可以通過插入兩個 DateTimeSupported 元素使我們的策略無效,其中一個元素應該會導致錯誤。 圖 55. 重復的 DateTimeSupported 斷言導致的驗證錯誤 故障診斷如果驗證結果不是預期的,可以查看 Eclipse 錯誤日志(Window > Show View > General > Error Log)。架構解析器將生成異常,它們應該有助于您診斷問題。例如,如果我們忘記更改 xs:Duration 屬性類型,則會看到以下異常: com.ibm.alphaworks.wspolicy.validator.SchemaParsingException: Unrecognised attribute key: duration
圖 56. 架構解析器生成的一個異常
|