2014-09-19 24 views
5

che sto cercando di generare un cliente con Maven e JAXB da un file WSDL con 2 schemi all'interno e alcuni elementi con lo stesso nome di diversi schemiPersonalizzazione pacchetti Java JAXB wsimport

Quando provo ad eseguire la compilazione I 'm ottenere l'errore successivo:

Two declarations cause a collision in the ObjectFactory class. 

schemi WSDL:

<wsdl:types> 
    <schema targetNamespace="http://ws.services" xmlns="http://www.w3.org/2001/XMLSchema">...</schema> 
    <schema targetNamespace="http://ws.models" xmlns="http://www.w3.org/2001/XMLSchema">...</schema> 
</wsdl:types> 

ho provato a cambiare titolo gli elementi che produce l'errore, ma quindi il mio client molla riceve il messaggio SOAP corretto, ma non inserisce correttamente l'oggetto risposta (tutti i suoi attributi sono nulli). Immagino che il problema potrebbe venire dal ridenominare le classi di risposta, ecco perché sto cercando di generare diversi pacchetti mantenendo il nome originale di tutte le classi.

Per fare ciò, ho scritto il file successivo, ma non so cosa sto facendo male che non funziona.

bindings.xml di file:

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

<jaxb:bindings schemaLocation="mywsdl.wsdl#types?schema1" 
    node="/xs:schema[@targetNamespace='http://ws.services']"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="package1" /> 
     </jaxb:schemaBindings> 
</jaxb:bindings> 

<jaxb:bindings schemaLocation="mywsdl.wsdl#types?schema2" 
    node="/xs:schema[@targetNamespace='http://ws.models']"> 
     <jaxb:schemaBindings> 
      <jaxb:package name="package2" /> 
     </jaxb:schemaBindings> 
</jaxb:bindings> 

</jaxb:bindings> 

La mia parte di configurazione nel file Maven è il prossimo, nel caso in cui è utile:

<groupId>org.jvnet.jax-ws-commons</groupId> 
<artifactId>jaxws-maven-plugin</artifactId> 
<version>2.3</version> 
<executions> 
    <execution> 
     <goals> 
      <goal>wsimport</goal> 
     </goals> 
    </execution> 
</executions> 
<configuration> 
    <wsdlLocation>wsdl/mywsdl.wsdl</wsdlLocation> 
    <wsdlDirectory>src/main/resources/wsdl</wsdlDirectory> 
    <wsdlFiles> 
     <wsdlFile>mywsdl.wsdl</wsdlFile> 
    </wsdlFiles> 
    <bindingDirectory>src/main/resources/wsdl</bindingDirectory> 
    <bindingFiles> 
     <bindingFile>bindings.xml</bindingFile> 
    </bindingFiles> 
    <packageName>original.package</packageName> 
    <sourceDestDir>${basedir}/src/main/java</sourceDestDir> 
</configuration> 

Quando compilo con questo file attacchi , appare lo stesso errore. Quindi penso che forse non è giusto.

Trovate errori?

Grazie.

+0

Solo un consiglio: è possibile rimuovere la sezione di configurazione "bindingFiles" del tutto se si posiziona tutti i file di legame in src/jaxws! Verranno quindi rilevati automaticamente dal plugin jaxws-maven. – headcr4sh

risposta

7

Dalla mia esperienza è preferibile creare 2 file di collegamento (uno per ogni file WSDL). Aggiorna il tuo pom.xml di conseguenza e fare in modo che l'elemento principale del file di collegamento è jaxws: attacchi (e non JAXB:! Binding)

Alcuni indizi:

  1. assicurarsi di impostare la Attributo "wsdlLocation" correttamente! Deve puntare al file WSDL usando un percorso relativo!
  2. Il pacchetto jaxws: determina il pacchetto che verrà utilizzato per le classi di servizio generate. (il materiale annotato con @WebService)
  3. Abilita o disabilita wrapperStyle e asyncMapping come desideri. ;-) file di collegamento per "package1"

Esempio:

<?xml version="1.0" encoding="UTF-8"?> 

    <jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
        xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
        xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        wsdlLocation="mywsdl.wsdl" 
        version="2.0"> 

     <jaxws:package name="package1"/> 
     <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle> 
     <jaxws:enableAsyncMapping>true</jaxws:enableAsyncMapping> 

     <jaxws:bindings node="//wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='http://ws.services']"> 
      <jaxb:schemaBindings> 
       <jaxb:package name="package1"/> 
      </jaxb:schemaBindings> 
     </jaxws:bindings> 

    </jaxws:bindings> 
+1

Grazie mille !, ha funzionato. Importante !, quando ho compilato la prima volta il plugin ha ignorato la mia nuova configurazione del pacchetto perché utilizzava il precedente dal mio file pom, una volta rimosso ' original.package' ha creato diversi pacchetti. Però...Spring non sta compilando correttamente il mio oggetto risposta e posso vedere nel mio logger che il messaggio SOAP di risposta è corretto, quindi questa soluzione non ha risolto il mio problema principale. – maqjav