2010-10-20 53 views
7

這是我的第一個問題,所以請溫柔;)Chameleon XSD導入的JAXB解決方法?

我困住了一個奇怪的問題。基本上我得到三個XSD定義如下所示:

PartA.xsd 
targetNameSpace="PartA" 
include="PartB.xsd" 

PartB.xsd 
<!-- no namespace definition!!! --> 

PartC.xsd 
targetNameSpace="PartC" 
inlude="PartB.xsd" 
import="PartA.xsd" 

錯誤彈出,通過JAXB綁定C部分到Java類時:

  • 具有相同的名稱「B類/接口。 exampleType「已被使用。使用類定製來解決此衝突。
  • 這個令人困惑的錯誤發生的原因很可能是因爲該模式使用了一種名爲「chameleon schema」的技術,該技術會導致將單個定義多次加載到不同的名稱空間中。有關更多信息,請參閱http://forums.java.net/jive/thread.jspa?threadID=18631

下面的鏈接,我發現,實際的錯誤在於PartB,它沒有命名空間聲明!此方法稱爲變色龍架構PartB中定義的類型將採用導入XSD的的名稱空間。

所以在我的情況下,對於同一類型的兩個命名空間:

  1. 「A部」
  2. 「C部分」

這就是,在JAXB分解。我還沒有找到正確綁定PartC的方法。和(使事情棘手)我有機會改變原來的XSD定義!

有沒有人遇到過這種現象或之前類似的東西,並有一個有效的解決方法呢?

回答

1

以下是可用的,雖然它並沒有提供很多細節:

+0

感謝您的鏈接,但你是對的,它不是很詳細。由於我沒有對架構的寫訪問權限,我被卡住了。 ......雖然,也許我可以與模式作者爭論「在其他一些情況下,變色龍模式可以被認爲是一種糟糕的模式設計,因爲它在很多地方複製了定義。」點。 – Gruber 2010-10-21 09:17:06

0

我有同樣的問題,谷歌搜索登陸我在這裏。 您的問題已經足夠詳細了,我能夠找到答案, 我所做的是將命名空間放在PartB.xsd中,並使用XJC生成Java類。 我增加了以下內容:

xmlns:ns="http://www.myCompany.com/2009/01/CustSchema" targetNamespace="http://www.myCompany.com/2009/01/CustSchema"

3

我面臨使用WSDL2Java的同樣的問題:

WSDLToJava Error: Thrown by JAXB : A class/interface with the same name "Respuesta" is already in use. Use a class customization to resolve this conflict.

但這question我指出了正確的方向。 使用CFX中的wsdl2java,您可以使用binding.xml文件自定義元素如何綁定到類。 例如:

/Applications/apache-cxf-2.7.13/bin/wsdl2java -b ./src/main/resources/binding.xml -V -d src/main/java -compile -classdir target/classes http://someurl.wsdl 

的關鍵是在binding.xml解釋命名某些XSD元素與一個especific類名,以避免colissions:

<jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.1"> 

    <jxb:bindings schemaLocation="./someXsdFile.xsd"> 
    <!-- Rename the respuesta class to resolve a naming conflict with other Respuesta element already defined--> 
    <jxb:bindings node="//xs:element[@name='respuesta']/xs:complexType"> 
     <jxb:class name="Respuesta2" /> 
    </jxb:bindings> 
    </jxb:bindings> 
</jxb:bindings> 

希望這有助於給下一個人用這問題使用wsdl2java。我認爲其他工具應該允許類似的問題。