2017-06-20 88 views
1

我有3周的XSD連接在一起:MOXY-多的XSD導入定義 - 錯誤相同的模式:「元件」已定義

schema1.xsd 
    imports namespace="x:y:z" schemaLocation= "schemaDefinitions.xsd" 
    includes schema2.xsd 
schema2.xsd 
    imports namespace="x:y:z" schemaLocation= "schemaDefinitions.xsd" 
    includes schema3.xsd 
schema3.xsd 
    imports namespace="x:y:z" schemaLocation= "schemaDefinitions.xsd" 

這些的XSD是由外部源提供,並且不能被改變。

以前我的項目使用標準的JAXB和編譯時創建的類。目前我切換到動態JAXB MOXY(運行),現在收到我的DynamicJAXBContextFactory.createContextFromXSD()線,採用schema1.xsd爲的FileInputStream以下錯誤:

Exception in thread "main" java.lang.ExceptionInInitializerError at 
    TestTool.JavaRoot.TestTools.MainTool.main(MainTool.java:55) 
    Caused by: Exception [EclipseLink-50040] (Eclipse Persistence Services - 
    2.6.2.v20151217-774c696): 
    org.eclipse.persistence.exceptions.JAXBException 
Exception Description: Error creating DynamicJAXBContext. 
    Internal Exception: org.xml.sax.SAXParseException; systemId: 
    file:///public/SITE1/config/schema/SchemaDefinitions.xsd; lineNumber: 
    xyz; columnNumber: xyz; 'xyz' is already defined 

我已經決定的原因是,所有三個模式都導入schemaDefinitions.xsd。如果我從schema2和schema3中刪除導入語句,則會解決該錯誤。這個錯誤並沒有出現在以前的jaxb實現中,並且自從切換到MOXY後xsds沒有改變。

問題:

  1. 是否合法/有效的XSD文件導入/包括這樣

  2. 什麼是可能的變通,因爲我不能修改的XSD?也許修改綁定xjb文件?

回答

1

解決問題,通過把下面的行MyEntityResolver.java類關閉錯誤檢查:

System.setProperty("com.sun.tools.xjc.api.impl.s2j.SchemaCompilerImpl.noCorrectnessCheck", "true"); 

我曾在我的主Java類試圖在此之前,顯然這就是錯誤的地方吧!

+0

很高興你能解決你的問題。如果您決定仍然允許進行驗證的解決方案,請更新您的答案。謝謝。 – kjhughes

1

另一個回答者可能能夠直接與重複的聲明範圍內的任何莫西配置支持,幫助,但在純粹的XSD級別:

  1. 不幸的是,W3C XSD建議書允許執行相關的行爲在多次導入XSD時發生。 (請參閱4.2.3 References to schema components across namespaces中的最後一項註釋)
  2. 根據構建MOXy的基礎XSD處理器,您可以設置一個標誌以允許/禁止多次導入。對於Xerces,參見honour-all-schemaLocations;對於Saxon,參見multipleSchemaImports

Is it an error to import the same XSD multiple times?


注一pending improvement請參閱在multipleSchemaImports語義。

+0

謝謝,這給了我一些東西來看看。不幸的是,MOXY似乎沒有很多追隨者來協助。也許我會在我的EntityResolver中設置這個撒克遜國旗?我用moxy找到的例子似乎沒有涉及到這個問題。我還玩過noCorrectnessCheck標誌(顯示在:http://www.eclipse.org/eclipselink/documentation/2。5/solutions/jpatoxml006.htm),但似乎沒有多大幫助 – JavaBeast

+0

「honor-all-schemaLocations」和「multipleSchemaImports」通常通過解析器配置文件,命令行開關或可能的API參數進行設置。 – kjhughes

+0

嗯,我真的不知道如何將它應用於MOXY術語,所有這些對我來說都是新鮮事物。在這一點上,Im半贊成讀取文件並手動刪除導入行。但這是非常hackish,我可能不能與我自己生活 – JavaBeast