2011-09-20 57 views
6

看看下面的過度簡化XSD:幫助請:XJC拋出「兩個聲明引起ObjectFactory類碰撞」

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="com.acme" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Widget"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element 
        minOccurs="0" name="color" nillable="true" type="xs:string" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="WidgetColor" type="xs:string" /> 
</xs:schema> 

然後,嘗試以下操作:

xjc test.xsd 

你應該總是得到以下例外:

parsing a schema... 
compiling a schema... 
[ERROR] Two declarations cause a collision in the ObjectFactory class. 
    line 11 of file:/C:/test.xsd 

[ERROR] (Related to above error) This is the other declaration. 
    line 7 of file:/C:/test.xsd 

Failed to produce code. 

請注意,有一個元素名稱「Widget「這是一個複雜類型,並具有名爲」顏色「的元素。還有,與元素「Widget」相同的級別,名爲「WidgetColor」的簡單元素。

什麼是更令人費解的是,如果你刪除屬性的minOccurs =「0」 OR從「色」元素序列中刪除屬性的nillable =「真」,XJC編譯模式成功。

有沒有人見過這個問題或可以提出解決方案?

謝謝,

邁克。

回答

6

那麼我終於想出瞭如何解決我的問題。它在於使用自定義綁定爲其中一個聲明指定不同的類名。定製binding.xjb的

內容

<?xml version="1.0" encoding="UTF-8"?> 
<bindings version="2.0" xmlns="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <bindings schemaLocation="test.xsd"> 
     <bindings node="//xs:element[@name='WidgetColor']"> 
      <class name="BaseWidgetColor" /> 
     </bindings> 
    </bindings> 
</bindings> 

操作:

C:\>xjc -b custom-binding.xjb test.xsd 
parsing a schema... 
compiling a schema... 
acme\com\BaseWidgetColor.java 
acme\com\ObjectFactory.java 
acme\com\Widget.java 
acme\com\package-info.java 

耐心等longueur德臨時工價mieux闕憤怒等acharnement ...!