2011-10-24 15 views
9

Questo mi sta facendo impazzire. Ho uno schema incorporato all'interno di un WSDL che ha bisogno di personalizzazione, perché wsimport sta gettando il seguente errorePersonalizzazioni JAXB con un WSDL scadente

[ERROR] Complex type and its child element share the same name "DomainsMap". 
Use a class customization to resolve this conflict. 
line 878 of file:/C:/jaxws-ri/bin/ArtesiaWebServices.wsdl 

1) Non ho alcun controllo su questo WSDL come Sto costruendo un WSDL primo cliente e mi aspetto di andare oltre le revisioni senza alcuna consulenza o rilascio formale. 2) Non è più accettabile correggere manualmente questo conflitto di nomi perché è necessario includere la costruzione di stub in una catena di build automatizzata.

Devo utilizzare un file di personalizzazione esterno. Non riesco proprio a capire come far funzionare la personalizzazione.

Ecco il frammento incriminato WSDL:

<wsdl:definitions> 
    <wsdl:types> 
     <xs:schema> 
     . 
     . 
     . 
     <xs:complexType final="extension restriction" name="domainsMap"> 
     <xs:sequence> 
      <xs:element name="domainsMap"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element maxOccurs="unbounded" minOccurs="0" name="entry"> 
        <xs:complexType> 
        <xs:sequence> 
         <xs:element minOccurs="0" name="key" type="xs:string"/> 
         <xs:element minOccurs="0" name="value" type="tns:domainValueMap"/> 
        </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
       </xs:sequence> 
      </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
     </xs:complexType> 

Questa sarebbe una grande occasione per voi di flettere le vostre abilità JAXB. Qualsiasi aiuto sarebbe molto apprezzato.

Sono stato a fissare la documentazione di jaxb per ore e ancora senza fortuna. Posso offrire l'intera WSDL, se necessario. Qualcuno può aiutare?

risposta

16

Bene stamattina sono venuto a lavorare e sono riuscito a capirlo. A volte basta allontanarsi dal problema e tornare con una testa fresca è il modo migliore. Ecco la soluzione che ha funzionato per me:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<jaxws:bindings 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    wsdlLocation="ArtesiaWebServices.wsdl"> 

    <enableWrapperStyle>true</enableWrapperStyle> 
    <enableAsyncMapping>false</enableAsyncMapping> 
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='domainsMap']/xs:sequence/xs:element[@name='domainsMap']/xs:complexType"> 
     <!-- This binding will fix the domainsMap inner element called domainsMap. sheesh, who names stuff like that?! --> 
     <jaxb:class name="DomainsMapElement"/> 
    </jaxws:bindings> 
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='domainValueMap']/xs:sequence/xs:element[@name='domainValueMap']/xs:complexType"> 
     <!-- This binding will fix the domainValueMap inner element called domainValueMap. sheesh, who names stuff like that?! --> 
     <jaxb:class name="DomainValueMapElement"/> 
    </jaxws:bindings> 
</jaxws:bindings> 

Io uso il file di rilegatura esterna sopra con lo strumento wsimport nel seguente comando.

cose importanti su questo file di rilegatura:

  • Lo spazio dei nomi per jaxws attacchi viene utilizzato. Questo è l'unico modo per far funzionare correttamente la selezione del nodo
  • La selezione del nodo deve terminare con/xs: complexType. Se ti fermi a selezionare il nome dell'elemento, il compilatore genererà errori.

    wsimport -D generato -keep -b ArtesiaExternalBinding.xml ArtesiaWebServices.wsdl

opzioni utilizzate:
-d generato specifica la directory di output (una cartella denominata 'generato' in questo caso)
-b ArtesiaExternalBinding.xml indica al compilatore JAXB di utilizzare il file di bind.
-keep mantenere gli stub (mi basta usare gli stub per l'ispezione)

finalmente, ho scoperto che questo è il bocconcino più utile di informazioni: java.net documents on jaxws customizations

Questo è ciò che mi portano a nidificazione della personalizzazioni jaxb all'interno di tag jaxws. Grazie per il link Petru Gardea

+1

Finalmente! Grazie! Ha risolto i miei problemi .. – fachexot

+4

SOAP .... Soo molte ore sprecate uomo – dolbysurnd

+0

Lontano ... Questo semplicemente non funziona senza i tag 'jaxws' magici quando si usa' wsimport' all'interno del plugin di maven. Grazie. – Strelok

3

Non è chiaro che cosa hai provato o no, ma vorrei fare quanto segue: - utilizzare l'opzione -b nella riga di comando wsimport (doc disposizione here). - le informazioni sui file vincolanti sono reperibili here; - Una vista approfondita con esempi su come personalizzare per evitare conflitti di nomi è here. Sto fornendo un estratto qui - dovrebbe risolvere il tuo problema.

<jxb:schemaBindings> 
     <jxb:package name="primer.myPo"> 
     <jxb:javadoc> 
    <![CDATA[<body> Package level documentation for generated package primer.myPo.</body>]]> 
     </jxb:javadoc> 
     </jxb:package> 
     <jxb:nameXmlTransform> 
      <jxb:elementName suffix="Element"/> 
     </jxb:nameXmlTransform> 
</jxb:schemaBindings> 
+1

Scusa, ho pensato che seguirai i link che ho allegato qui; il collegamento "informazioni sui file vincolanti" è ancorato a questa affermazione: "Questi binding JAXB possono vivere all'interno dello schema o come figlio di un elemento jaxws: bindings." –