Matthew Wilson 和 Katherine Sanders 2011 年 10 月 13 日發(fā)布
使用 Validator for WS-Policy in Eclipse本節(jié)闡述如何使用 Validator for WS-Policy in
Eclipse 調(diào)試無效 WS-Policy 導(dǎo)致的錯誤。這會使用到本文包含的樣例應(yīng)用程序,還要使用 IBM? Rational? Application Developer 8.0.2 和 IBM WebSphere? Application Server 7.0.0.17。 設(shè)置 IBM WebSphere Application Server 和 IBM Rational Application
Developer要識別測試項目錯誤時將用到的運行時環(huán)境,則必須在 IBM Rational Application Developer 中創(chuàng)建一個服務(wù)器。這將創(chuàng)建一個從工作臺到現(xiàn)有應(yīng)用服務(wù)器安裝或服務(wù)器配置文件的指針。在本文中,IBM WebSphere Application Server 7.0.0.17 安裝將用作樣例應(yīng)用程序的應(yīng)用服務(wù)器。但是,在創(chuàng)建這個服務(wù)器之前,還必須創(chuàng)建合適的 Server Runtime Environment 和 IBM WebSphere Application Profile,如果它們還不存在的話。最后,必須啟動服務(wù)器,準備好安裝和啟動應(yīng)用程序。 使用一個新工作空間中啟動 IBM Rational Application Developer 8.0.2。 關(guān)閉 Welcome 頁。您現(xiàn)在應(yīng)該位于 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" 復(fù)選框 > Next。
圖 9. 禁用管理安全性 檢查配置文件細節(jié) > Next
圖 10. 檢查配置文件創(chuàng)建摘要 配置文件創(chuàng)建后,取消選中 "Launch the First steps console" 復(fù)選框 > Finish。
圖 11. 完成配置文件創(chuàng)建向?qū)?/h5> 關(guān)閉 Profile Management Tool。 檢查新配置文件現(xiàn)在是否已在底部面板中列出。然后單擊 OK 關(guān)閉 Preferences 窗口。
創(chuàng)建并啟動一個服務(wù)器Servers 選項卡 > 右鍵單擊 > New > Server。
圖 12. 新建一個服務(wù)器 選擇 "WebSphere Application Server v7.0" > Next。
圖 13. 選擇服務(wù)器類型 確保選擇剛剛創(chuàng)建的配置文件的名稱 > Finish。
圖 14. IBM WebSphere Application Server 設(shè)置 Servers 選項卡 > 右鍵單擊 "WebSphere Application Server v7.0.0.17 at localhost" > start。
圖 15. 啟動服務(wù)器 導(dǎo)入并運行樣例應(yīng)用程序樣例應(yīng)用程序使用了一個 Policy Set,默認情況下,IBM WebSphere
Application Server 和 IBM Rational Application Developer 中沒有安裝它,因此必須先導(dǎo)入它。然后,可以將樣例應(yīng)用程序 EAR 文件導(dǎo)入 IBM Rational Application Developer 工作空間,并在上一節(jié)中創(chuàng)建的服務(wù)器上啟動它。應(yīng)用程序運行后,就可用于發(fā)送一個同步 Web 服務(wù)請求。但是,這將產(chǎn)生一個異常,而不是返回一條成功響應(yīng)消息,因為樣例應(yīng)用程序中的 WS-Policy 是無效的。 將樣例應(yīng)用程序所需的提供者策略集導(dǎo)入 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. 導(dǎo)入 Policy Set 滾動到頁面底部,單擊箭頭移動到第 2 頁。 選中 "WS-Security default" 旁邊的復(fù)選框 > OK > Save。
圖 18. 選擇 WS-Security 默認 Policy Set 退出并關(guān)閉 Administrative Console。 將樣例應(yīng)用程序所需的提供者策略集導(dǎo)入 IBM Rational
Application Developer 并下載本文包含的 WSSecurity default.zip 文件。 在 Enterprise Explorer 視圖中右鍵單擊 > Import > Import...
圖 19. 打開導(dǎo)入向?qū)?/h5> Web services / WebSphere Policy Sets > Next
圖 20. 導(dǎo)入 Policy Set 瀏覽導(dǎo)入的文件 > Finish
圖 21. 導(dǎo)入下載的 Policy Set 導(dǎo)入已破壞的樣例應(yīng)用程序并下載本文包含的 InvalidPolicy.ear 文件。 右鍵單擊 Enterprise Explorer > Import > EAR File。
圖 22. 導(dǎo)入一個 EAR 文件 瀏覽您下載的文件,確認目標運行庫 = "WebSphere Application Server v7.0.0.17" > Finish
圖 23. 導(dǎo)入下載的 EAR 文件 注意,使用 IBM Rational Application Developer 附帶的默認插件時,樣例應(yīng)用程序的編譯沒有錯誤。
圖 24. 導(dǎo)入的樣例應(yīng)用程序編譯沒有錯誤 運行已破壞的樣例應(yīng)用程序并選擇 Servers 選項卡 > 右鍵單擊 "WebSphere Application Server v7.0.0.17 at localhost" > Add and Remove...
圖 25. 打開 Add and Remove 向?qū)?/h5> 選擇 Available 列中的 InvalidPolicy > Add > Finish
圖 26. 添加已破壞的樣例應(yīng)用程序 應(yīng)用程序成功發(fā)布后,請注意,服務(wù)器狀態(tài)已經(jīng)更改為 [Started, Synchronized]。
圖 27. 檢查服務(wù)器狀態(tài) 打開一個 Web 瀏覽器,導(dǎo)航到 http://<WAS_HOST>:<WAS_PORT>/wssamplesei/demo,例如 http://localhost:9080/wssamplesei/demo。 選擇 Message Type = Synchronous Echo, Message String = hello > Send Message。一個異常會出現(xiàn)。
圖 28. 調(diào)用已破壞的樣例應(yīng)用程序 Web 服務(wù) 分析錯誤并定位無效 WS-Policy當 Server Runtime Environment 中出現(xiàn)錯誤時,錯誤日志會顯示在 IBM Rational Application Developer 中的控制臺視圖中。在本例中,將有一個錯誤指出客戶端上的 WS-Security 配置中有問題,需要確定客戶端是否是使用提供者 WSDL 文檔中的 WS-Policy 配置的。 查看 IBM Rational Application Developer 中的控制臺并觀察下面的消息:
清單 1. 運行已破壞的樣例應(yīng)用程序后的錯誤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 服務(wù)客戶端被配置為使用提供者策略。 選擇 Services 視圖 > JAX-WS/Clients/SampleClientSei: {http://com/ibm/was/wssample/sei/echo/}EchoService > Manage Policy Set Attachment...
圖 29. 管理客戶端 Policy Set 附件 注意,所有服務(wù)都被設(shè)置為 "Acquire Provider Policy"。
圖 30. 查看每個服務(wù)的策略獲取 單擊 "Use Provider Policy...",觀察是否使用 HTTP GET 從默認 WSDL URL 中獲取策略。
圖 31. 查看提供者策略 WSDL URL 定位包含提供者策略的 WSDL 文件并導(dǎo)航到 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 插件由于已經(jīng)確認提供者 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要驗證是否已經(jīng)正確安裝該插件,則應(yīng)該檢查配置,確保驗證器已經(jīng)啟用并且會在 WSDL 文檔上運行。 重啟 IBM Rational Application Developer 后,請轉(zhuǎn)到 Window > Preferences。 Validation > 確保 WS-Policy 驗證器已經(jīng)啟用("Manual" 和 "Build" 復(fù)選框均已選中)。
圖 40. 確保已啟用 WS-Policy 驗證器 單擊 "WS-Policy validator" 旁邊的 "..." 按鈕打開 Settings。 檢查 WS-Policy Validator 是否會在所有擴展名為 wsdl 和 xml 的文件上運行。單擊 Cancel。
圖 41. 驗證器使用的文件類型 Validation / WS Policy Validator。注意,這個子頁允許使用自定義架構(gòu)文件。默認情況下,這個架構(gòu)目錄是空的,以便使用插件提供的架構(gòu)。下面的 “測試架構(gòu)” 將詳細介紹相關(guān)內(nèi)容。
圖 42. WS Policy Validator 架構(gòu)目錄 驗證已破壞的樣例應(yīng)用程序中的無效 WS-Policy項目中的所有文件都將將獲得驗證,提供者 WSDL 文檔中會出現(xiàn)一個 WS-Policy 錯誤,此前將該文檔標識為客戶端配置錯誤的根源。可以使用一個標記來標識無效的特定 WS-Policy 斷言,錯誤消息會說明有一個斷言缺失。可以使用規(guī)范和提供者配置作為指導(dǎo),通過添加缺失的斷言來解決這個問題。 圖 43. 驗證 WS-Policy 驗證結(jié)束時,單擊 OK 關(guān)閉 Validation Results 對話框。
圖 44. 驗證結(jié)果 注意,會有一個新的 Invalid WS-Policy 錯誤出現(xiàn)在 Markers 選項卡中。該錯誤指出 AlgorithmSuite 斷言至少必須出現(xiàn)一次。
圖 45. Markers 選項卡中的 Invalid WS-Policy 錯誤 雙擊錯誤會打開 InvalidPolicy/SampleServicesSei/WebContent/WEB-INF/wsdl/Echo.wsdl 文件,并會突出顯示相關(guān)的行。注意,這是我們前面指出的那個文件。它包含 Web 服務(wù)提供者發(fā)布的 WS-Policy,客戶端正在使用這個提供者策略來配置自己。 注意,錯誤位于一個 AsymmetricBinding 斷言中。
圖 46. 無效 AsymmetricBinding 斷言 注意 WS-Security
Policy 1.2 規(guī)范 中的 AsymmetricBinding 斷言的語法。正如錯誤中說明的那樣,AlgorithmSuite 是必需的,但它缺少以下內(nèi)容:
清單 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 退出并關(guān)閉 Administrative Console。 將以下 WS-Policy 斷言添加到 Echo.wsdl 中,以便使用 Basic128Rsa15 斷言(在 Layout 斷言上面的 AsymmetricBinding/Policy 斷言中):
清單 5. 樣例應(yīng)用程序的 Algorithm Suite 策略1 2 3 4 5 | < ns2:AlgorithmSuite >
< wsp:Policy >
< ns2:Basic128Rsa15 />
</ wsp:Policy >
</ ns2:AlgorithmSuite >
|
保存更改。注意,Invalid WS-Policy 錯誤消失了。
重新運行修改后的樣例應(yīng)用程序要使 WS-Policy 更改在客戶端配置上生效,必須重啟服務(wù)器。應(yīng)用程序重新運行后,會發(fā)送另一個 Web 服務(wù)請求,這次會收到一條成功響應(yīng)消息。WS-Security 配置錯誤不會再出現(xiàn)在控制臺日志中。 Servers 選項卡 > 右鍵單擊 "WebSphere Application Server v7.0.0.17 at localhost" > Restart。這可以確保重新創(chuàng)建的是客戶端策略集,而不是使用前面的無效配置的緩存副本。
圖 51. 重啟服務(wù)器 導(dǎo)航到 http://<WAS_HOST>:<WAS_PORT>/WSSampleSei/EchoService?wsdl,例如 http://localhost:9080/WSSampleSei/EchoService?wsdl,確保 WSDL 已經(jīng)刷新,AlgorithmSuite 斷言存在。 導(dǎo)航到 http://<WAS_HOST>:<WAS_PORT>/wssamplesei/demo,例如 http://localhost:9080/wssamplesei/demo。 選擇 Message Type = Synchronous Echo, Message String = hello > Send Message。 響應(yīng)成功返回,字符串 hello 返回。
圖 52. 調(diào)用修改后的樣例應(yīng)用程序 Web 服務(wù) 注意,這個錯誤不再出現(xiàn)在控制臺記錄中。
總結(jié)樣例應(yīng)用程序在提供者 WSDL 文檔中包含無效 WS-Policy。由于客戶端被配置為讀取 WS-Policy 并使用它配置客戶端的 WS-Security 設(shè)置,因此 Web 服務(wù)調(diào)用會失敗。 要調(diào)試這個失敗,請檢查控制臺中的日志中的錯誤。日志中顯示的一個錯誤表明問題出現(xiàn)在客戶端策略集配置中??蛻舳吮慌渲脼槭褂脕碜?WSDL 文檔的提供者策略,這意味著 WS-Policy 存在無效的可能性。 安裝 Validator for WS-Policy in Eclipse 插件后,要驗證項目中的所有文件。唯一的錯誤出現(xiàn)在提供者的 WSDL 文件中,錯誤指出缺少一個 AlgorithmSuite 斷言。當打開文件時,錯誤標記也會指出 Assymmetric 綁定斷言中缺失 AlgorithmSuite 斷言。 為修復(fù)此錯誤,我們添加了與提供者的配置相對應(yīng)的 AlgortithmSuite 斷言。這個插件提供的文檔還包含更多 WS-Policy 驗證錯誤示例,并介紹了如何修復(fù)這些錯誤。 提供者的 WSDL 文檔中的 WS-Policy 的長度超過 100 行,沒有一個標準 Eclipse 驗證器能夠識別其中的錯誤。而且,WS-Security Policy 非常復(fù)雜,因此手動驗證每個斷言非常耗時,而且手動驗證很容易出錯。顯然,如果沒有 Validator for WS-Policy in Eclipse,這個小錯誤將花費大量時間和精力才能得以解決。 創(chuàng)建自己的架構(gòu)Validator for WS-Policy in Eclipse 由一些現(xiàn)有的架構(gòu)提供,這些架構(gòu)可用于支持 IBM WebSphere Application Server 7.0 的所有 WS-Policy 斷言。但是,可以通過其他規(guī)范使用的用戶定義架構(gòu)來擴展該插件。例如,您可能想在您的 WSDL 中包含一些 WS-Policy 斷言,供另一個平臺上的端點使用。本節(jié)將展示如何為 Validator for WS-Policy in Eclipse 構(gòu)造一個支持 WS-Eventing 規(guī)范 的架構(gòu)。 WS-Eventing 描述了使用 Web 服務(wù)在另一個 Web 服務(wù)或應(yīng)用程序中注冊您感興趣的活動的方法。它描述了允許服務(wù)管理其事件相關(guān)訂閱的訂閱管理器。為了表明對 WS-Eventing 的支持,指定了兩個 WS-Policy 斷言。EventSource 斷言用于表明服務(wù)接受創(chuàng)建訂閱的請求,SubscriptionManager 斷言表明服務(wù)支持代表其他服務(wù)管理訂閱。這兩個斷言的結(jié)構(gòu)都比較簡單,因此可以作為展示如何創(chuàng)建架構(gòu)的簡單示例。驗證器的架構(gòu)文件的格式是經(jīng)過預(yù)先設(shè)計的,以便從一個正式規(guī)范創(chuàng)建架構(gòu)成為一個簡單任務(wù)。因此,這種格式主要基于 WS-Security Policy 等 OASIS 規(guī)范中使用的語法慣例。但是,驗證器的確需要向這個語法信息添加一些額外的元數(shù)據(jù)并對其結(jié)構(gòu)實施一些限制。架構(gòu)文件被劃分為很多部分,每個部分都以一個位于方括號中的標題開頭。 前兩個部分關(guān)注與規(guī)范有關(guān)的 XML 命名空間。第一個部分是 [Namespaces],它列示架構(gòu)中使用的命名空間前綴及其對應(yīng)的經(jīng)過限定的命名空間,類似于基本 XML 文檔中的 xmlns 屬性。注意,與 xmlns 不同,使用的每個命名空間都必須通過其前綴進行聲明,并在架構(gòu)的其余部分通過前綴引用;不支持使用完全限定的斷言。對于 WS-Eventing,我們只關(guān)心一個命名空間,即 WS-Eventing 命名空間;在規(guī)范的 3.5 節(jié) 中提供了這個命名空間,它使用了前綴 wse。我們將這部分編碼如下: 清單 6. 架構(gòu)的命名空間部分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. 架構(gòu)的 PolicyNamespace 部分1 2 3 4 | [PolicyNamespaces]
<
"http://www./ns/ws-policy"
>
|
架構(gòu)的其余部分關(guān)注斷言本身。每個頂級斷言都應(yīng)該在一個單獨的 [Syntax] 部分中描述。這些部分的語法非常類似于 Web 服務(wù)規(guī)范中使用的語法,通常可以從那些部分進行輕松修改。對于在幾個頂級斷言中包含重復(fù)斷言片段的規(guī)范,可以在 [Referenced] 部分中包含這些片段。但是,WS-Eventing 規(guī)范不需要這種設(shè)置。 為創(chuàng)建 EventSource 斷言的 [Syntax] 部分,我們要先復(fù)制規(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 >
|
然后,我們需要進行以下修改,以便使其遵守驗證器支持的架構(gòu)格式: 在 <wse:EventSource
...> 之后添加基數(shù)指示符 ?,指出頂級斷言在策略中不是必需的。如果不這樣做,驗證器會期望在其驗證的每個策略中找到這個斷言。 移動基數(shù)指示符,使其出現(xiàn)在 <wse:FilterDialect>、<wse:FormatName> 和 <wse:NotificationPolicy> 的起始標記而不是結(jié)束標記之后。 從標記集合中移除 xs:any* 。通過閱讀規(guī)范中給出的描述,我們發(fā)現(xiàn)這些標記旨在表明元素的可擴展性,因此我們使用省略號...替代它們。 替換為 Expires 斷言的屬性提供的 xs:duration 類型,因為驗證器不支持該類型。xs:unsignedLong 是一個合適的替代類型。
修改后的語法如下所示: 清單 9. 架構(gòu)中將包含的 EventSource 斷言的經(jīng)過修改的語法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] 部分,這可以通過應(yīng)用上面的規(guī)則來完成。這些規(guī)則普遍適用于以這種形式提供語法的架構(gòu)?,F(xiàn)在就完成了我們的架構(gòu);完成的文件作為一個下載本文提供。 測試架構(gòu)創(chuàng)建支持 WS-Eventing 的架構(gòu)后,現(xiàn)在可以使用安裝了 Validator for WS-Policy in Eclipse 的 IBM Rational Application Developer 來測試它。驗證器將默認情況下會使用 Eclipse 插件 jar 中分發(fā)的架構(gòu)文件。要使用您自己的架構(gòu)文件,則必須將驗證器配置為指向從中讀取架構(gòu)文件的目錄: Window > Preferences 從列表中選擇 WS-Policy Validator。 單擊首選項頁上的瀏覽按鈕,選擇一個目錄。然后,驗證器將讀取選中目錄中所有擴展名為 .schema 的文件。刪除這個字段的內(nèi)容會導(dǎo)致驗證器再次使用默認位置。 如果您想將您自己的架構(gòu)添加到驗證器提供的架構(gòu)中,請將驗證器分發(fā)的 .schema 文件復(fù)制到您配置的目錄中。這些文件可以從插件 jar 文件中的架構(gòu)文件夾提取。 重啟 IBM Rational Application Developer 使更改生效。
圖 53. 配置驗證器使用的架構(gòu)目錄 現(xiàn)在我們創(chuàng)建一些 WS-Policy 來進行驗證: 切換到 Resource 透視圖。 File > New... > Project 在 New Project 對話框中選擇 General > Project。然后單擊 Next。 輸入一個項目名稱并單擊 Finish。 File > New > File 選擇您的項目并輸入一個合適的文件名,例如 policy.xml。 向您的文件添加一些策略。下面的策略應(yīng)該夠用:
清單 10. 測試架構(gòu)的基本策略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 >
|
如果架構(gòu)正確,則不會出現(xiàn)驗證錯誤。您將看到一個關(guān)于 mex:Location 元素的警告,因為該元素不是架構(gòu)的一部分。 圖 54. WS-Eventing 斷言的正確驗證 要確保驗證正在工作,可以通過插入兩個 DateTimeSupported 元素使我們的策略無效,其中一個元素應(yīng)該會導(dǎo)致錯誤。 圖 55. 重復(fù)的 DateTimeSupported 斷言導(dǎo)致的驗證錯誤 故障診斷如果驗證結(jié)果不是預(yù)期的,可以查看 Eclipse 錯誤日志(Window > Show View > General > Error Log)。架構(gòu)解析器將生成異常,它們應(yīng)該有助于您診斷問題。例如,如果我們忘記更改 xs:Duration 屬性類型,則會看到以下異常: com.ibm.alphaworks.wspolicy.validator.SchemaParsingException: Unrecognised attribute key: duration
圖 56. 架構(gòu)解析器生成的一個異常
|