本節(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。
要識別測試項(xiàng)目錯誤時(shí)將用到的運(yùn)行時(shí)環(huán)境,則必須在 IBM Rational Application Developer 中創(chuàng)建一個(gè)服務(wù)器。這將創(chuàng)建一個(gè)從工作臺到現(xiàn)有應(yīng)用服務(wù)器安裝或服務(wù)器配置文件的指針。在本文中,IBM WebSphere Application Server 7.0.0.17 安裝將用作樣例應(yīng)用程序的應(yīng)用服務(wù)器。但是,在創(chuàng)建這個(gè)服務(wù)器之前,還必須創(chuàng)建合適的 Server Runtime Environment 和 IBM WebSphere Application Profile,如果它們還不存在的話。最后,必須啟動服務(wù)器,準(zhǔn)備好安裝和啟動應(yīng)用程序。
使用一個(gè)新工作空間中啟動 IBM Rational Application Developer 8.0.2。
關(guān)閉 Welcome 頁。您現(xiàn)在應(yīng)該位于 Java? EE 透視圖中。
創(chuàng)建一個(gè) Server Runtime Environment:選擇 Window > Preferences
Server / Runtime Environments > Add
選擇 "WebSphere Application Server v7.0" > Next
名稱 = "WebSphere Application Server v7.0.0.17",安裝目錄 = <WAS_HOME>(例如, C:\Program Files\IBM\WebSphere\AppServer)> Finish
創(chuàng)建一個(gè) IBM WebSphere Application Server Profile:選擇 Window > Preferences
Server / WebSphere Application Server > Run Profile Management Tool
在打開 Profile Management Tool 之后,單擊 Launch Profile Management Tool。
單擊 Create...
確保已選中 "Application Server" > Next
確保已選中 "Typical profile creation" > Next
取消選中 "Enable administrative security" 復(fù)選框 > Next。
檢查配置文件細(xì)節(jié) > Next
配置文件創(chuàng)建后,取消選中 "Launch the First steps console" 復(fù)選框 > Finish。
關(guān)閉 Profile Management Tool。
檢查新配置文件現(xiàn)在是否已在底部面板中列出。然后單擊 OK 關(guān)閉 Preferences 窗口。
Servers 選項(xiàng)卡 > 右鍵單擊 > New > Server。
選擇 "WebSphere Application Server v7.0" > Next。
確保選擇剛剛創(chuàng)建的配置文件的名稱 > Finish。
Servers 選項(xiàng)卡 > 右鍵單擊 "WebSphere Application Server v7.0.0.17 at localhost" > start。
樣例應(yīng)用程序使用了一個(gè) Policy Set,默認(rèn)情況下,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)用程序運(yùn)行后,就可用于發(fā)送一個(gè)同步 Web 服務(wù)請求。但是,這將產(chǎn)生一個(gè)異常,而不是返回一條成功響應(yīng)消息,因?yàn)闃永龖?yīng)用程序中的 WS-Policy 是無效的。
將樣例應(yīng)用程序所需的提供者策略集導(dǎo)入 IBM WebSphere Application Server:選擇 Servers 選項(xiàng)卡 > 右鍵單擊 "WebSphere Application Server v7.0.0.17 at localhost" > Administration > Run Administrative Console...
Administrative Console > Services / Policy Sets / Application Policy Sets > Import... > From default repository...
滾動到頁面底部,單擊箭頭移動到第 2 頁。
選中 "WS-Security default" 旁邊的復(fù)選框 > OK > Save。
退出并關(guān)閉 Administrative Console。
將樣例應(yīng)用程序所需的提供者策略集導(dǎo)入 IBM Rational Application Developer 并下載本文包含的 WSSecurity default.zip 文件。
在 Enterprise Explorer 視圖中右鍵單擊 > Import > Import...
Web services / WebSphere Policy Sets > Next
瀏覽導(dǎo)入的文件 > Finish
導(dǎo)入已破壞的樣例應(yīng)用程序并下載本文包含的 InvalidPolicy.ear 文件。
右鍵單擊 Enterprise Explorer > Import > EAR File。
瀏覽您下載的文件,確認(rèn)目標(biāo)運(yùn)行庫 = "WebSphere Application Server v7.0.0.17" > Finish
注意,使用 IBM Rational Application Developer 附帶的默認(rèn)插件時(shí),樣例應(yīng)用程序的編譯沒有錯誤。
運(yùn)行已破壞的樣例應(yīng)用程序并選擇 Servers 選項(xiàng)卡 > 右鍵單擊 "WebSphere Application Server v7.0.0.17 at localhost" > Add and Remove...
選擇 Available 列中的 InvalidPolicy > Add > Finish
應(yīng)用程序成功發(fā)布后,請注意,服務(wù)器狀態(tài)已經(jīng)更改為 [Started, Synchronized]。
打開一個(gè) Web 瀏覽器,導(dǎo)航到 http://<WAS_HOST>:<WAS_PORT>/wssamplesei/demo,例如 http://localhost:9080/wssamplesei/demo。
選擇 Message Type = Synchronous Echo, Message String = hello > Send Message。一個(gè)異常會出現(xiàn)。
當(dāng) Server Runtime Environment 中出現(xiàn)錯誤時(shí),錯誤日志會顯示在 IBM Rational Application Developer 中的控制臺視圖中。在本例中,將有一個(gè)錯誤指出客戶端上的 WS-Security 配置中有問題,需要確定客戶端是否是使用提供者 WSDL 文檔中的 WS-Policy 配置的。
查看 IBM Rational Application Developer 中的控制臺并觀察下面的消息:
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=[{}]). |
注意,生成策略集配置時(shí),客戶端上出現(xiàn)了錯誤:
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...
注意,所有服務(wù)都被設(shè)置為 "Acquire Provider Policy"。
單擊 "Use Provider Policy...",觀察是否使用 HTTP GET 從默認(rèn) WSDL URL 中獲取策略。
定位包含提供者策略的 WSDL 文件并導(dǎo)航到 http://<WAS_HOST>:<WAS_PORT>/WSSampleSei/EchoService?wsdl,例如 http://localhost:9080/WSSampleSei/EchoService?wsdl。
注意,這個(gè) URL 重定向到 http://<WAS_HOST>:<WAS_PORT>/WSSampleSei/EchoService/WEB-INF/wsdl/Echo.wsdl,這是因?yàn)檎谑褂玫?WSDL 是提供者 WAR 中的一個(gè)已打包的文件(InvalidPolicy/SampleServicesSei/WebContent/WEB-INF/wsdl/Echo.wsdl)。
由于已經(jīng)確認(rèn)提供者 WSDL 文檔中的 WS-Policy 有問題,但 Eclipse 中的現(xiàn)有驗(yàn)證器沒有發(fā)現(xiàn)原因所在,因此將安裝 Validator for WS-Policy in Eclipse 插件。安裝將通過其他 Eclipse 插件使用的標(biāo)準(zhǔn)更新機(jī)制來完成。
從 alphaWorks 下載 VWPE.zip,這個(gè) Zip 文件包含 Validator for WS-Policy in Eclipse 1.0。
在一個(gè)本地目錄中解壓 VWPE.zip,在指定目錄中創(chuàng)建一個(gè)本地更新站點(diǎn)。
Help > Install New Software...
單擊 Add...
單擊 Local...,選擇前面解壓的 VWPE 目錄。
輸入 Name VWPE 并單擊 OK。
選擇 Validator for WS-Policy in Eclipse 插件并單擊 Next。
檢查安裝細(xì)節(jié)并單擊 Next。
檢查并接受許可,單擊 Finish。
單擊 OK 忽略安全警告。
安裝完成后,單擊 Restart Now 重啟帶有新插件的 IBM Rational Application Developer。
要驗(yàn)證是否已經(jīng)正確安裝該插件,則應(yīng)該檢查配置,確保驗(yàn)證器已經(jīng)啟用并且會在 WSDL 文檔上運(yùn)行。
重啟 IBM Rational Application Developer 后,請轉(zhuǎn)到 Window > Preferences。
Validation > 確保 WS-Policy 驗(yàn)證器已經(jīng)啟用("Manual" 和 "Build" 復(fù)選框均已選中)。
單擊 "WS-Policy validator" 旁邊的 "..." 按鈕打開 Settings。
檢查 WS-Policy Validator 是否會在所有擴(kuò)展名為 wsdl 和 xml 的文件上運(yùn)行。單擊 Cancel。
Validation / WS Policy Validator。注意,這個(gè)子頁允許使用自定義架構(gòu)文件。默認(rèn)情況下,這個(gè)架構(gòu)目錄是空的,以便使用插件提供的架構(gòu)。下面的 “測試架構(gòu)” 將詳細(xì)介紹相關(guān)內(nèi)容。
項(xiàng)目中的所有文件都將將獲得驗(yàn)證,提供者 WSDL 文檔中會出現(xiàn)一個(gè) WS-Policy 錯誤,此前將該文檔標(biāo)識為客戶端配置錯誤的根源??梢允褂靡粋€(gè)標(biāo)記來標(biāo)識無效的特定 WS-Policy 斷言,錯誤消息會說明有一個(gè)斷言缺失。可以使用規(guī)范和提供者配置作為指導(dǎo),通過添加缺失的斷言來解決這個(gè)問題。
驗(yàn)證結(jié)束時(shí),單擊 OK 關(guān)閉 Validation Results 對話框。
注意,會有一個(gè)新的 Invalid WS-Policy 錯誤出現(xiàn)在 Markers 選項(xiàng)卡中。該錯誤指出 AlgorithmSuite 斷言至少必須出現(xiàn)一次。
雙擊錯誤會打開 InvalidPolicy/SampleServicesSei/WebContent/WEB-INF/wsdl/Echo.wsdl 文件,并會突出顯示相關(guān)的行。注意,這是我們前面指出的那個(gè)文件。它包含 Web 服務(wù)提供者發(fā)布的 WS-Policy,客戶端正在使用這個(gè)提供者策略來配置自己。
注意,錯誤位于一個(gè) AsymmetricBinding 斷言中。
注意 WS-Security Policy 1.2 規(guī)范 中的 AsymmetricBinding 斷言的語法。正如錯誤中說明的那樣,AlgorithmSuite 是必需的,但它缺少以下內(nèi)容:
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 的語法:
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 選項(xiàng)卡 > 右鍵單擊 "WebSphere Application Server v7.0.0.17 at localhost" > Administration > Run Administrative Console...
Services / Policy sets / Application policy sets > WS-Security default
單擊 WS-Security
單擊 Main Policy
單擊 Algorithms for asymmetric tokens。注意,提供者正在使用 Basic128Rsa15。
退出并關(guān)閉 Administrative Console。
將以下 WS-Policy 斷言添加到 Echo.wsdl 中,以便使用 Basic128Rsa15 斷言(在 Layout 斷言上面的 AsymmetricBinding/Policy 斷言中):
1 2 3 4 5 | < ns2:AlgorithmSuite > < wsp:Policy > < ns2:Basic128Rsa15 /> </ wsp:Policy > </ ns2:AlgorithmSuite > |
保存更改。注意,Invalid WS-Policy 錯誤消失了。
要使 WS-Policy 更改在客戶端配置上生效,必須重啟服務(wù)器。應(yīng)用程序重新運(yùn)行后,會發(fā)送另一個(gè) Web 服務(wù)請求,這次會收到一條成功響應(yīng)消息。WS-Security 配置錯誤不會再出現(xiàn)在控制臺日志中。
Servers 選項(xiàng)卡 > 右鍵單擊 "WebSphere Application Server v7.0.0.17 at localhost" > Restart。這可以確保重新創(chuàng)建的是客戶端策略集,而不是使用前面的無效配置的緩存副本。
導(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 返回。
注意,這個(gè)錯誤不再出現(xiàn)在控制臺記錄中。
樣例應(yīng)用程序在提供者 WSDL 文檔中包含無效 WS-Policy。由于客戶端被配置為讀取 WS-Policy 并使用它配置客戶端的 WS-Security 設(shè)置,因此 Web 服務(wù)調(diào)用會失敗。
要調(diào)試這個(gè)失敗,請檢查控制臺中的日志中的錯誤。日志中顯示的一個(gè)錯誤表明問題出現(xiàn)在客戶端策略集配置中。客戶端被配置為使用來自 WSDL 文檔的提供者策略,這意味著 WS-Policy 存在無效的可能性。
安裝 Validator for WS-Policy in Eclipse 插件后,要驗(yàn)證項(xiàng)目中的所有文件。唯一的錯誤出現(xiàn)在提供者的 WSDL 文件中,錯誤指出缺少一個(gè) AlgorithmSuite 斷言。當(dāng)打開文件時(shí),錯誤標(biāo)記也會指出 Assymmetric 綁定斷言中缺失 AlgorithmSuite 斷言。
為修復(fù)此錯誤,我們添加了與提供者的配置相對應(yīng)的 AlgortithmSuite 斷言。這個(gè)插件提供的文檔還包含更多 WS-Policy 驗(yàn)證錯誤示例,并介紹了如何修復(fù)這些錯誤。
提供者的 WSDL 文檔中的 WS-Policy 的長度超過 100 行,沒有一個(gè)標(biāo)準(zhǔn) Eclipse 驗(yàn)證器能夠識別其中的錯誤。而且,WS-Security Policy 非常復(fù)雜,因此手動驗(yàn)證每個(gè)斷言非常耗時(shí),而且手動驗(yàn)證很容易出錯。顯然,如果沒有 Validator for WS-Policy in Eclipse,這個(gè)小錯誤將花費(fèi)大量時(shí)間和精力才能得以解決。
Validator for WS-Policy in Eclipse 由一些現(xiàn)有的架構(gòu)提供,這些架構(gòu)可用于支持 IBM WebSphere Application Server 7.0 的所有 WS-Policy 斷言。但是,可以通過其他規(guī)范使用的用戶定義架構(gòu)來擴(kuò)展該插件。例如,您可能想在您的 WSDL 中包含一些 WS-Policy 斷言,供另一個(gè)平臺上的端點(diǎn)使用。本節(jié)將展示如何為 Validator for WS-Policy in Eclipse 構(gòu)造一個(gè)支持 WS-Eventing 規(guī)范 的架構(gòu)。
WS-Eventing 描述了使用 Web 服務(wù)在另一個(gè) Web 服務(wù)或應(yīng)用程序中注冊您感興趣的活動的方法。它描述了允許服務(wù)管理其事件相關(guān)訂閱的訂閱管理器。為了表明對 WS-Eventing 的支持,指定了兩個(gè) WS-Policy 斷言。EventSource 斷言用于表明服務(wù)接受創(chuàng)建訂閱的請求,SubscriptionManager 斷言表明服務(wù)支持代表其他服務(wù)管理訂閱。這兩個(gè)斷言的結(jié)構(gòu)都比較簡單,因此可以作為展示如何創(chuàng)建架構(gòu)的簡單示例。驗(yàn)證器的架構(gòu)文件的格式是經(jīng)過預(yù)先設(shè)計(jì)的,以便從一個(gè)正式規(guī)范創(chuàng)建架構(gòu)成為一個(gè)簡單任務(wù)。因此,這種格式主要基于 WS-Security Policy 等 OASIS 規(guī)范中使用的語法慣例。但是,驗(yàn)證器的確需要向這個(gè)語法信息添加一些額外的元數(shù)據(jù)并對其結(jié)構(gòu)實(shí)施一些限制。架構(gòu)文件被劃分為很多部分,每個(gè)部分都以一個(gè)位于方括號中的標(biāo)題開頭。
前兩個(gè)部分關(guān)注與規(guī)范有關(guān)的 XML 命名空間。第一個(gè)部分是 [Namespaces],它列示架構(gòu)中使用的命名空間前綴及其對應(yīng)的經(jīng)過限定的命名空間,類似于基本 XML 文檔中的 xmlns 屬性。注意,與 xmlns 不同,使用的每個(gè)命名空間都必須通過其前綴進(jìn)行聲明,并在架構(gòu)的其余部分通過前綴引用;不支持使用完全限定的斷言。對于 WS-Eventing,我們只關(guān)心一個(gè)命名空間,即 WS-Eventing 命名空間;在規(guī)范的 3.5 節(jié) 中提供了這個(gè)命名空間,它使用了前綴 wse。我們將這部分編碼如下:
1 2 3 4 | [Namespaces] < wse = "http://www.w3.org/2011/03/ws-evt" > |
我們還必須在 [PolicyNamespaces]
部分中指定規(guī)范支持的 WS-Policy 規(guī)范的版本。這允許驗(yàn)證器驗(yàn)證斷言中嵌入的 WS-Policy 是否使用正確的規(guī)范版本,并對 WS-Policy 斷言的屬性使用正確的驗(yàn)證(WS-Policy 1.2 和 1.5 之間有區(qū)別)。WS-Eventing 規(guī)范只提到 WS-Policy 1.5,因此我們將這個(gè)部分編碼如下:
1 2 3 4 | [PolicyNamespaces] < "http://www.w3.org/ns/ws-policy" > |
架構(gòu)的其余部分關(guān)注斷言本身。每個(gè)頂級斷言都應(yīng)該在一個(gè)單獨(dú)的 [Syntax]
部分中描述。這些部分的語法非常類似于 Web 服務(wù)規(guī)范中使用的語法,通??梢詮哪切┎糠诌M(jìn)行輕松修改。對于在幾個(gè)頂級斷言中包含重復(fù)斷言片段的規(guī)范,可以在 [Referenced]
部分中包含這些片段。但是,WS-Eventing 規(guī)范不需要這種設(shè)置。
為創(chuàng)建 EventSource
斷言的 [Syntax]
部分,我們要先復(fù)制規(guī)范的 9.1 節(jié) 中展示的語法,如下所示:
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 > |
然后,我們需要進(jìn)行以下修改,以便使其遵守驗(yàn)證器支持的架構(gòu)格式:
在 <wse:EventSource...>
之后添加基數(shù)指示符 ?,指出頂級斷言在策略中不是必需的。如果不這樣做,驗(yàn)證器會期望在其驗(yàn)證的每個(gè)策略中找到這個(gè)斷言。
移動基數(shù)指示符,使其出現(xiàn)在 <wse:FilterDialect>、<wse:FormatName>
和 <wse:NotificationPolicy>
的起始標(biāo)記而不是結(jié)束標(biāo)記之后。
從標(biāo)記集合中移除 xs:any*
。通過閱讀規(guī)范中給出的描述,我們發(fā)現(xiàn)這些標(biāo)記旨在表明元素的可擴(kuò)展性,因此我們使用省略號...替代它們。
替換為 Expires
斷言的屬性提供的 xs:duration
類型,因?yàn)轵?yàn)證器不支持該類型。xs:unsignedLong
是一個(gè)合適的替代類型。
修改后的語法如下所示:
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)建一個(gè) [Syntax]
部分,這可以通過應(yīng)用上面的規(guī)則來完成。這些規(guī)則普遍適用于以這種形式提供語法的架構(gòu)?,F(xiàn)在就完成了我們的架構(gòu);完成的文件作為一個(gè)下載本文提供。
創(chuàng)建支持 WS-Eventing 的架構(gòu)后,現(xiàn)在可以使用安裝了 Validator for WS-Policy in Eclipse 的 IBM Rational Application Developer 來測試它。驗(yàn)證器將默認(rèn)情況下會使用 Eclipse 插件 jar 中分發(fā)的架構(gòu)文件。要使用您自己的架構(gòu)文件,則必須將驗(yàn)證器配置為指向從中讀取架構(gòu)文件的目錄:
Window > Preferences
從列表中選擇 WS-Policy Validator。
單擊首選項(xiàng)頁上的瀏覽按鈕,選擇一個(gè)目錄。然后,驗(yàn)證器將讀取選中目錄中所有擴(kuò)展名為 .schema 的文件。刪除這個(gè)字段的內(nèi)容會導(dǎo)致驗(yàn)證器再次使用默認(rèn)位置。
如果您想將您自己的架構(gòu)添加到驗(yàn)證器提供的架構(gòu)中,請將驗(yàn)證器分發(fā)的 .schema 文件復(fù)制到您配置的目錄中。這些文件可以從插件 jar 文件中的架構(gòu)文件夾提取。
重啟 IBM Rational Application Developer 使更改生效。
現(xiàn)在我們創(chuàng)建一些 WS-Policy 來進(jìn)行驗(yàn)證:
切換到 Resource 透視圖。
File > New... > Project
在 New Project 對話框中選擇 General > Project。然后單擊 Next。
輸入一個(gè)項(xiàng)目名稱并單擊 Finish。
File > New > File
選擇您的項(xiàng)目并輸入一個(gè)合適的文件名,例如 policy.xml。
向您的文件添加一些策略。下面的策略應(yīng)該夠用:
1 2 3 4 5 6 7 8 9 10 11 | < wsp:Policy xmlns:wsp = "http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wse = "http://www.w3.org/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://example.com/Notif_WSDL_Metadata" /> </ wse:FormatName > </ wse:EventSource > </ wsp:Policy > |
如果架構(gòu)正確,則不會出現(xiàn)驗(yàn)證錯誤。您將看到一個(gè)關(guān)于 mex:Location
元素的警告,因?yàn)樵撛夭皇羌軜?gòu)的一部分。
要確保驗(yàn)證正在工作,可以通過插入兩個(gè) DateTimeSupported 元素使我們的策略無效,其中一個(gè)元素應(yīng)該會導(dǎo)致錯誤。
如果驗(yàn)證結(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