2010-10-20 19 views
7

questa è la mia prima domanda, quindi per favore sii gentile;)Soluzione JAXB per le importazioni di Chameleon XSD?

Sono bloccato con uno strano problema. Essenzialmente ottengo tre definizioni XSD come la seguente:

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

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

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

L'errore si apre, quando vincolante PARTC via JAXB di classi Java:

  • Una classe/interfaccia con lo stesso nome "b. exampleType "è già in uso. Utilizzare una personalizzazione della classe per risolvere questo conflitto.
  • Questo errore di confusione si è verificato molto probabilmente perché lo schema utilizza una tecnica denominata "schema camaleonte", che fa sì che una singola definizione venga caricata più volte in spazi dei nomi diversi. Vedi http://forums.java.net/jive/thread.jspa?threadID=18631 per ulteriori informazioni.

Seguendo il collegamento, ho scoperto, l'errore reale si trova in ParteB, che non ha una dichiarazione dello spazio dei nomi! Questo metodo è chiamato Chameleon Schema. I tipi definiti in Part.B adotteranno lo spazio dei nomi dell'importazione XSD.

Quindi, nel mio caso, ci sono due spazi dei nomi per lo stesso tipo:

  1. "parta"
  2. "PARTC"

e questo è, dove JAXB si rompe. Non ho trovato un modo per legare correttamente PartC. E (per rendere le cose difficili) ho la possibilità di cambiare le definizioni originali XSD!

Qualcuno si è imbattuto in questo fenomeno o qualcosa del genere prima e ha una soluzione valida per questo?

risposta

1

Di seguito è disponibile, anche se non fornisce molti dettagli:

+0

Grazie per il collegamento, ma hai ragione, non è molto dettagliato. E dal momento che non ho accesso in scrittura sullo schema, sono bloccato. ... Anche se, forse, posso discutere con l'autore dello schema su "In alcuni altri casi, lo schema camaleonte può essere considerato come una cattiva progettazione dello schema, poiché duplica le definizioni in molti punti". punto. – Gruber

0

ho avuto lo stesso problema e la ricerca di Google mi ha atterrato qui. La tua domanda è abbastanza dettagliata e sono stato in grado di trovare la risposta, quello che ho fatto è mettere lo spazio dei nomi in PartB.xsd e usare XJC per generare le classi java. ho aggiunto il seguente:

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

3

stavo affrontando lo stesso problema usando 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.

Ma questo question mi ha segnalato nella giusta direzione. Utilizzando wsdl2java da CFX è possibile personalizzare il modo in cui gli elementi vengono associati alle classi utilizzando un file binding.xml. Per esempio:

/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 

La chiave è quello di spiegare in binding.xml per citarne certo elemento XSD con un especific className per evitare 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> 

Spero che questo aiuti alla persona successiva alla presente problema con wsdl2java. Suppongo che altri strumenti dovrebbero consentire simili approcci a questo problema.

Problemi correlati