我有3個互相依賴的xsd文件來構建我的元素定義。每個xsd文件都有自己的名稱空間。當我使用JAXB xjc生成我的類時,我得到3個相應的包。到現在爲止還挺好。如何控制JAXB內存架構生成排序/序列?
我的問題出現在我想用unmarshaller進行模式驗證時。爲了避免必須讀取xsd文件,我從被解組的類中動態生成模式。但是,由於該類依賴於來自其他兩個包的對象,因此除非指定所有3個包,否則無法生成這些架構。這已經不是一個非常實用的解決方案,因爲它要求我事先知道對象層次結構/依賴關係樹,並相應地指定包列表。
當我嘗試使用SchemaFactory(SchemaFactory.newSchema(Source []))從3個生成的模式創建新模式時,我會遇到更大的問題。顯然,模式提供給模式工廠的順序對於解決依賴關係至關重要。如果數組中的第一個模式依賴於從陣列中的最後一個元素的類型定義,我得到解決的錯誤:
org.xml.sax.SAXParseException: src-resolve: Cannot resolve the name 'ns1:InCalculationDataType' to a(n) 'type definition' component.
如果我修改的順序,先放3架構,它成功沒有錯誤。
這使得幾乎不可能編寫一個相當通用的方法,而是必須單獨爲每個XSD情況編寫代碼。
有什麼我可以做的,以緩解這個問題?有沒有辦法強制SchemaFactory首先讀取所有內容,並且只有在發現任何錯誤時纔會產生錯誤?我知道你可以創建一個ErrorHandler,但是JavaDocs指出如果它拋出一個致命錯誤,任何進一步的處理都是不可靠的。
編輯
只是我自己的心安,我試圖創建其忽略非致命錯誤(只是記錄它們),但生成的模式不可靠,無法正確驗證一個錯誤處理程序XML錯誤。因此,它對我沒有任何價值。
編輯完
任何建議或想法,將不勝感激。
謝謝!
埃裏克
我記得在我的經驗,我有一個案子時'SchemaFactory.newSchema模式的順序()'事做。如果記得沒錯,那正是你得到的:一旦架構取決於其他。但是如果你想立即生成模式,你知道它們之間的依賴關係嗎? – 2012-01-13 22:59:46
是的,我確實知道它們的依賴關係,但考慮到我想要在運行時生成幾個不同的xsd,我希望使用通用的一段代碼來實例化所需的class/pkg中的JAXBContext並生成模式根據其需求。但是,如果我需要手動編寫依賴關係,那麼每個XSD代必須獨立編碼,這是一種難看的解決方案,因爲我有幾個這樣的XSD /對象可以生成。 – 2012-01-14 02:26:37