熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

WebLogic Workshop 8.1中處理不帶命名空間模式

2022-06-13   來源: JSP教程 

  摘要

  將遺留應用程序或集成系統與BEA WebLogic Workshop集成在一起時經常要用到XML和模式然而某些遺留系統在最初設計時並沒有包括處理XML命名空間的功能相反這些遺留系統只接受不帶目標命名空間的無格式XML消息而這可能導致在WebLogic Workshop中出現沖突事實上可以在多個模式中定義名稱相同的全局類型或元素

  本文描述了如何通過WebLogic Workshop和XMLBeans簡單而有效地解決這個問題本文假定您對XML模式和XMLBeans有一些基本了解您可以下載本文中使用的示例

  簡介

  XMLBeans提供了一種處理XML的方法即操作代表XML的Java類這些類是使用XML適合的模式來創建的可以使用XMLBeans來編譯一個或多個模式文件從而生成Java類型

  集成遺留解決方案時遇到的一個常見問題是要與不同來源的多個模式打交道而這些模式均未帶有指定的目標命名空間如果這些模式共享元素名稱WebLogic Workshop模式項目就無法成功編譯生成的Java類型而且還會出現諸如Duplicate global typeDuplicate global element這樣的錯誤下面舉例說明這樣一個場景

  場景實例

  假設您使用WebLogic Workshop創建了一個新的應用程序通常您會創建一個模式項目導入您的模式然後WebLogic Workshop將自動把這個模式編譯為XMLBeans

  <xs:schema xmlns:po= xmlns:xs= elementFormDefault=qualified> <xs:element name=purchaseorder type=customer/> <xs:complexType name=customer> <xs:sequence> <xs:element name=name type=xs:string/> <xs:element name=address type=xs:string/> </xs:sequence> </xs:complexType></xs:schema>

  清單 : Schemaxsd

  Schema沒有目標命名空間所得到的XML文檔中帶有元素名稱name和address如下所示

  <?xml version= encoding=UTF?><purchaseorder xmlns:po= xmlns:xsi=instance > <name>John</name> <address> North First St</address></purchaseorder>

  清單 : Samplexml

  如果您嘗試從這個模式生成Java類型它將被正確地編譯為一個XMLBean現在可以導入另一個模式

  <xs:schema xmlns:xs= xmlns:foo= elementFormDefault=qualified> <xs:element name=clientrecord type=customer/> <xs:complexType name=customer> <xs:sequence> <xs:element name=name type=xs:string/> <xs:element name=address type=xs:string/> <xs:element name=phone type=xs:string/> </xs:sequence> </xs:complexType> <xs:element name=purchaseorder type=customer/></xs:schema>

  清單 : Schemaxsd

  Schema 同樣沒有目標命名空間下面的XML文檔就是這個模式的一個實例它帶有元素名稱name address和 phone

  <?xml version= encoding=UTF?><clientrecord xmlns:foo= xmlns:xsi=instance> <name>Susan</name> <address> South Second St</address> <phone></phone></clientrecord>

  清單 : Samplexml

  在WebLogic Workshop中當把這兩個模式文件導入到一個模式項目中並生成XMLBeans類時WebLogic Workshop將顯示編譯錯誤

  

  ERROR: error: Duplicate global type: customer ERROR: error: Duplicate global element: purchaseorder

  可以看到編譯器提示說全局類型customer和全局元素purchaseorder被多次定義如果看看我們的模式就會發現這並不值得驚奇當模式不帶目標命名空間時這類沖突就很可能會出現下面將給出解決這個問題的辦法

  解決方案

  有很多可行的解決方案都可以解決這個問題我將挑出其中三種進行討論

  解決方案添加目標命名空間

  為模式添加不同的目標命名空間就可以解決這個問題——我們也推薦使用這種方法但是在大部分時間裡您都無法控制模式所以我們需要另尋出路

  解決方案創建單獨的模式項目

  解決該問題的另一種方法是在WebLogic Workshop中創建兩個模式項目在這個例子中假設您在應用程序中創建了另一個Schema項目並分別在模式項目和模式項目中編譯schemaxsd和schemaxsd如圖所示

  在這種情況下可以成功編譯模式兩個項目都不會抱怨定義重復然而看看圖中生成的類便知Libraries文件夾包含兩個jar文件SchemaPjar和SchemaPjar這兩個文件是WebLogic Workshop編譯的結果兩個jars文件中均定義了noNamespaceCustomer和noNamespacePurchaseOrderDocument類如下圖所示

  在WebLogic Workshop 8.1中處理不帶命名空間的模式圖-1

  圖: 一個包含兩個模式項目的WebLogic Workshop應用程序

  應用程序中創建了名稱相同的Java類(XMLBeans)結果您無法選擇要在應用程序中使用的那一個在這種情況下還是存在前面出現過的沖突問題但是這次遇到麻煩的是應用程序類加載器

  您還會注意到Java包名稱noNamespace並非開發人員友好的應該根據您的編碼習慣對其進行修改這也為實際的解決方案指明了方向——只要修改包名稱便可避免沖突第三種解決方案中可以解決這些問題

  解決方案使用XMLBeans配置文件

  在DevDev站點上您可以讀一篇有關XMLBeans編譯器選項的優秀文章即Hetal Shah編寫的配置 XMLBeans(中文)(DevDev月)這篇文章中提到運行XMLBeans編譯器時您可以指定一個可選的配置文件用於修改XMLBeans生成器的行為這樣就可以解決名稱沖突和包名稱不友好的問題

  您可以在模式project中創建一個compilerxsdconfig文件如圖所示您將看到一個錯誤

  ERROR: compilerxsdconfig:: Document D:\SP\user_projects\domains\DevDev\SchemaP\compilerxsdconfig is not an xsd config file

  您可以忽略上面的錯誤不會出現問題因為所創建的文件目前是空的和無效的您可以使用這個配置文件指定Java包的名稱從而為定義中缺少目標命名空間的XML元素和類型生成XMLBeans此處的技巧在於使用保留字##local如下所示

  <xb:config xmlns:xb=> <xb:namespace uri=##local> <xb:package>comfoo>/xb:package> </xb:namespace> </xb:config>

  清單 : compilerxsdconfig

  現在如果打開Libraries文件夾您將會看到模式Projectjar包含Java包comfoo中的類而不是圖中noNamespace中的類顯然您應該使用有效的Java包名稱否則將產生錯誤

  在WebLogic Workshop 8.1中處理不帶命名空間的模式圖-2

  圖 : WebLogic Workshop項目中xsdconfigxml和結果jars文件的位置

  現在通過創建一個類似的compilerxsdconfig文件您可以對Project執行同樣的步驟

  結束語

  遺留XML應用程序有時會省略命名空間而這可能會導致集成問題本文說明了如何使用XMLBeans配置文件編譯模式從而減輕這個問題帶來的困擾通過這個XMLBeans配置文件您可以控制如何為生成的類型選擇名稱設計該配置文件的目的是把模式類型名稱映射為生成的Java類型名稱當一些模式擁有相同的命名空間時同樣的方法可以防止類似問題的出現


From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19569.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.