本文中,我們將演示一種 XML 驗證方法,它使用 OASIS Content Assembly Mechanism (CAM) 模板,支持與使用 B2B 或 B2C 的業務伙伴進行各種復雜消息交換。CAM 模板可簡化並形象化驗證規則,同時允許網關對不相干的信息直接放行。我們還介紹了使用 Eclipse 和Java™ 技術構造開源組件來發布所需驗證服務的經驗。按照實際過程學習應用程序開發流程,其中還有使用 STAR (Standards for Technology in Automotive Retail) Automotive Business Object Document (BOD) 模式和相關 CAM XML 模板的代碼片段和 XML 示例。
業務和技術挑戰
在目前,面臨著與大量貿易伙伴用 XML 交換復雜信息和相關大型 XSD 模式的情況,對即將發生的交易進行支持和准確的處理就成為了巨大挑戰。目前, XML 模式和 DTD 具有對 XML 文檔的結構化內容驗證,或者說檢驗的能力。某些驗證規則可以作為 XML 模式的一部分,但不是所有類型的事務驗證都可以用 XML 模式或 DTD 來執行。
常用縮略語
API: 應用程序編程接口
B2B: 企業對企業
B2C: 企業對客戶
DTD: 文檔類型定義
HTTP: 超文本傳輸協議
JAX-RPC: 基於 XML 遠程過程調用的 Java API
JDOM: 基於 Java 的文檔對象類型
J2EE: Java 2 平台,企業版
OASIS: 結構化信息標准推動組織
UI: 用戶界面
WSDL: Web 服務描述語言
XML: 可擴展標記語言
XPath: XML 路徑語言
XSD: XML 模式定義
XSLT: 可擴展樣式表語言轉換
隨著行業規范標准如 Standards for Technology in Automotive Retail (STAR) 的出現,同時也出現大量 XML 模式形式的標准 XML 消息交換格式。Web 服務的用戶和提供者都必須遵守這些模式,以通過行業標准組織認證。但這些行業規范模式是由最小驗證松散結合的,僅能用於傳入 XML 的結構驗證。需要額外的代碼來實現增加所需模式檢查的驗證。當那些希望所接收的數據符合特定格式或滿足業務內容驗證規則的應用程序或組件接收數據時,這些驗證可以防止錯誤發生。
在 Web 服務及其關聯 XML 應用程序中實現所需驗證邏輯的最常用方法就是編寫自定義代碼;結果,驗證規則隱藏在應用程序中,因此不能輕易修改,記錄,或共享。根據所需驗證的數量和性質,驗證代碼可能復雜冗長,而且在越來越多人參與其中後,維護將成為沉重負擔。除此之外,每次驗證邏輯改變,還將承擔將代碼重新編譯和部署到產品服務器的時間、精力和風險。
除了獨立的應用程序,通過 Enterprise Service Bus (ESB) 暴露服務時也需要驗證。圖 1 演示了一個圍繞消息總線的 ESB 的典型架構。該總線提供基於標准如 SOAP、HTTP 和 Java Messaging Service (JMS) 的消息發布。ESB 允許服務基於各自事務服務需求的質量進行交互。它還支持不同標准,如 SOAP、XML、WSDL、JMS、J2EE、JAX-RPC 等。
圖 1. 如何在 ESB 架構中執行驗證
查看原圖(大圖)
開發人員面臨的主要挑戰是當通過 ESB 交互時,如何在消息提供者與消息用戶之間執行消息驗證。例如,在 圖 1 中,Web 服務組件也許會需要來自現有應用程序的信息。Web 服務(使用者)通過 ESB 向現有應用程序(提供者)發出請求信息。應用程序組件需要請求符合某種格式,且含有正確信息,因此它會在處理前先驗證請求。Web 服務組件有自己的一套請求,而且會驗證響應信息。如果這兩個終端使用不同的協議或標准,ESB 會轉換所有消息並在轉換消息前執行驗證。
每個提供者和使用者都有自己的請求;因此,根據事務類型和驗證的數量,這會形成相當長的開發周期,包括定義、創建和測試所有驗證。這個穩定化階段會一直持續,直到每個驗證組件都能夠對其調用組件的消息驗證做出正確回饋。
解決方案描述
此處描述的解決方案的方法是基於 OASIS Content Assembly Mechanism (CAM) 規范實現 XML 驗證服務。OASIS CAM 模板方法是基於 XML 內容處理和驗證的簡單方法,它允許企業創建 XML 格式的通用交換模型。CAM 模板支持基於上下文的規則、代碼列表和跨域驗證。許多跨域驗證不能單獨在 XSD 模式下實施;其余情況下,已公布的行業模式不可能包容所有驗證變化。
解決方案包含 CAM Studio(基於 Eclipse 的 UI 模板編輯器),它用於定義 CAM 模板。CAMV 驗證引擎提供一組開源 Java API,它們用於在運行時用具體編譯的 CAM 模板驗證 XML。CAM Studio 模板編輯器支持向生成模板中添加自定義 XPath 表達式,不過 UI 可以定義大多數規則,而無需編寫自定義表達式。
圖 2 顯示了開發驗證規則生命周期中的建模、編寫與測試、部署和監控階段。
圖 2. 驗證規則生命周期
查看原圖(大圖)
建模階段
這一階段將確認數據條目與數據元素及其對應的驗證規則。所需的 XML 交換模式已定義;此外,所需元素將映射到現有行業標准模式,如 STAR (Standards for Technology in Automotive Retail)。
編寫與測試階段
使用 CAM Studio 編輯器來組裝或編寫 CAM 模板。這是用於創建 CAM 模板的可用的三個編輯器選項:
從頭創建或手工創建
使用現有 XML 模式
使用現有 XML 實例
一旦創建 CAM 模板,下一步是審查每一個元素和屬性,並制定適用的驗證規則。編輯器中的面板顯示每個模板節點的規則。圖 3 顯示的是 CAM 模板編輯器中模板結構的截屏:
圖 3. CAM TemplateEditor 中的 CAM 模板
查看原圖(大圖)
盡管不是所有驗證規則都是二進制位(即,通過或失敗),CAM 支持將驗證失敗劃分為警告。這種特性為下列場景帶來方便:可以在服務提供者端正常運行的動作,通過修改負載變得可用,而不是拒絕整個消息。例如,某個規則要求注釋字段長度在 255 個字符以內;盡管如此,長度超過最大值的消息不應被拒絕,而是應當發送警告給用戶將接收前 255 個字符。
在本文的 提示和技巧 一節中將看到設置消息分類警告的細節。
部署階段
先使用 CAM Studio 編輯器編譯 CAM 模板,然後是使用應用程序運行時 CAMV 引擎。編譯格式是原來 CAM 模板自身的縮略 XML 版本,並且可用於優化 CAMV 驗證引擎的性能。要編譯 CAM 模板,選擇 Tools > Compile Template 選項。這將生成 .cxx 文件格式的模板,它將會在運行時用到。
CAMV 驗證引擎提供簡單的開源 Java API,它可用於任何 Java 應用程序,用合適的 CAM 模板驗證輸入 XML。清單 1 中的代碼片段演示了 CAMV 的用法:
清單 1. CAMV API 用法
TemplateValidator tv = new TemplateValidator(templateDocument);
tv.setErrHandler(new ElementErrorHandler(tv));
boolean tvResult = tv.validate(ioReader);
if (tvResult){
System.out.println("No errors, might be warnings.....");
}
List errList = tv.getErrors();
List warnList = tv.getWarnings();
錯誤、警告消息格式如下:
<error classification>: <XPATH> => <error or warning message> => Node: <node name> => attribute: <attribute name>
例如,錯誤消息看上去像這樣:
/p:ProcessRepairOrder[1]/p:ApplicationArea[1]/p:CreationDateTime[1]=>Content does not conform to the mask:YYYY-MM-DD'T'HH:MI:SSZ =>Node: CreationDateTime
警告消息看上去像這樣:
Warning: /p:ProcessRepairOrder[1]/p:ProcessRepairOrderDataArea[1]/p:RepairOrder[1] /p:RepairOrderHeader[1]/p:OwnerParty[1]/p:SpecifIEdPerson[1]/p:ResidenceAddress[1] /p:LineOne[1]=> length should be less than 80 =>Node: LineOne
監控階段
通過使用 CAMV,可以將所有驗證檢查外部化而無需將其嵌入代碼或使用自定義編碼實現。在監控階段,可以通過簡單更新驗證模板來滿足額外驗證的需要。要添加額外驗證或移除現有驗證,只需重新分配編譯過的 CAM 模板(.cxx 文件)。如果發生驗證邏輯變化,無需重新編譯、重新部署任何 Java 代碼。
最新 CAMV 發行版的新特性
最新的(2009 年 12 月)CAMV 發行版中加入的重要特性有:
除了默認的 Java 1.6,還有向下兼容 Java 1.5 的發行版可供下載。
CAMV 是線程安全的;它可以部署在任何一個 J2EE 容器中,如 WebSphere® Application Server。
除 JDOM 文檔外,CAMV 還能以 StringReader 形式接收 XML 輸入,從而在消息處理中減少序列化和反序列化的實例。
可以在單個 XML 元素或屬性中定義多個情況。
提示和技巧
以下是我們在最近的一個項目中總結的提示和技巧,在該項目中,我們使用 CAMV 創建了 B2B 網關驗證框架,它用於為一家領先的汽車行業組織公開基於 STAR的 Web 服務。
驗證分類
CAMV 支持創建錯誤和警告消息的驗證規則。需要對 XML 元素指定條件 XPath 表達式來詳細描述對警告消息的驗證。
例如,考慮這樣的業務場景,如果某一字段超過規定的 255 個字符的限制,不一定要拒絕 Web 服務請求。業務決策是截斷字段長度到 255 個字符,如果它超過,就作為後台系統請求;但必須向調用組件發送警告。
可以通過在 CAM 模板規則中指定 printmessage() 表達式來處理這樣的場景。
消息文本必須有前綴 Warning:,後面是所需警告消息,如 length should be less than 255。完整的消息文本像這樣:Warning: length should be less than 255。
只有當特定元素長度超過指定長度,才會返回警告消息,該規則將會指定為有條件的,並創建 XPath 表達式來執行長度檢查,如 圖 4 所示,該圖為 CAM Studio 編輯器表達式條目向導工具屏幕截圖:
圖 4. 如何配置警告規則
查看原圖(大圖)
緩存 CAMV 模板
可以將 CAMV 模板緩存到內存中來執行重復驗證,而不需要每次執行驗證時從硬盤讀取模板。這會減少磁盤 I/O 並顯著提升性能和吞吐量。
驗證錯誤檢查
即使返回警告,CAMV Java 方法 TemplateValidator.validate(..) 還是返回 true。只有返回錯誤時,它才置為 false。因此,當返回警告時,使用 getWarnings() 方法來獲取所有警告消息列表。
驗證消息
如果返回的消息(它包含 XPath 路徑、驗證消息和節點名稱)不滿足業務場景,需要更多信息,客戶端應用程序可以創建自定義代碼。CAMV 在向輸入交換消息 XML 添加 CAMERROR 和 CAMWARN 屬性後,添加相同的輸入 XML,如 清單 2 所示。
清單 2. 執行驗證後修改的 XML
<p:ApplicationArea>
<p:Sender>
<p:CreatorNameCode>CNV</p:CreatorNameCode>
<p:SenderNameCode>SNC</p:SenderNameCode>
</p:Sender>
<p:CreationDateTime CAMERROR="CreationDateTime | Content does not conform to the
mask:YYYY-MM-DD'T'HH:MI:SSZ">2001-12-31T12:00:00</p:CreationDateTime>
<p:Destination/>
</p:ApplicationArea>
<p:ResidenceAddress>
<p:LineOne CAMWARN="WARNING:LineOne | length should be less than 80">100 Moon Drive
100 Moon Drive 100 Moon Drive 100 Moon Drive 100 Moon Drive 100 Moon Drive</p:LineOne>
<p:LineTwo>APT # 100</p:LineTwo>
<p:CityName>MALIBU</p:CityName>
<p:CountryID>US</p:CountryID>
<p:Postcode>99999</p:Postcode>
<p:StateOrProvinceCountrySub-DivisionID>CA</p:StateOrProvinceCountrySub-DivisionID>
</p:ResidenceAddress>
通配符表達式
當在模板中輸入規則時,XPath 驗證表達式指定為(默認情況下)使用兩個斜槓(//)的通配符表達式,它在文檔中從現有節點選擇符合的所有節點,而無論節點位於何處。
圖 5. 如何在定義規則時指定通配符表達式
查看原圖(大圖)
這會導致規則應用到特定元素的所有實例中(請注意:對於特定元素的其他實例,規則不會立刻可見,在 CAM 模板編輯器視圖中刷新後才可見)。
盡管如此,如果需要將檢查應用到 XML 元素的特定實例,建議在 Rule XPath 復選框選擇 Full。
圖 6. 如何在定義規則時指定顯式表達式
查看原圖(大圖)
結束語
使用 CAMV,可以執行一致的驗證檢查並快速改變規則來調整消息處理以符合特定合作伙伴交換和內容。通過外部化以前深嵌在後台應用程序代碼中的驗證規則,可以對更具預測性的消息處理進行控制和管理。這些基於標准的規則模板可以有選擇地與合作伙伴分享,從而更加促進系統內容處理的一致性。
有了更具靈活性和容錯性的流程,應用程序可以處理更多的內容變化,從而,輕松支持廣泛的交互合作伙伴,同時降低支持和維護成本 — 這與通常的經驗相反。
開源的使用極大促進了開發解決方案與將 CAMV 引擎集成到部署環境的融合。
總而言之,該項目展示出,XML 的創新使用和動態可配置 XML 可以提供比單獨依賴靜態編譯代碼源更好的、更穩定的、更快的、功能更強的用戶應用程序體驗。