2011-09-20 7 views
6

adottare le seguenti sopra XSD semplificata:aiuto per favore: xjc getta "Due dichiarazioni provocano una collisione nella classe 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> 

Quindi, tentare la seguente:

xjc test.xsd 

Si dovrebbe sempre avere la seguente eccezione:

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. 

si noti che v'è un nome di elemento "Widget "che è un tipo complesso e contiene elementi denominati" colore ". C'è anche, allo stesso livello dell'elemento "Widget", un elemento semplice denominato "WidgetColor".

Che cosa è più sconcertante è che se si rimuove l'attributo minOccurs = "0" O si rimuovere l'attributo nillable = "true" dalla sequenza elemento "colore", xjc compila lo schema con successo.

Qualcuno ha mai visto questo problema o può suggerire una soluzione?

Grazie,

Mike.

risposta

6

Bene, finalmente ho capito come risolvere il problema. Si tratta di utilizzare un'associazione personalizzata per specificare un nome di classe distinto per una delle dichiarazioni.

Contenuto del custom-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> 

Operation:

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 

Pazienza et longueur de temps valente mieux que rabbia et acharnement ...!