2014-09-19 5 views
5

Ich versuche, einen Client mit Maven und jaxb aus einer WSDL-Datei mit zwei Schemata innerhalb und einige Elemente mit dem gleichen Namen aus verschiedenen SchemataCustomizing Java-Pakete JAXB wsimport

zu erzeugen, wenn ich versuche, die Zusammenstellung auszuführen I bin der nächste Fehler bekommen:

Two declarations cause a collision in the ObjectFactory class. 

WSDL-Schemata:

<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> 

ich habe versucht, die Elemente umbenennen, dass produzieren Sie den Fehler, aber dann meine Frühjahrs-Client erhalten die richtige SOAP-Nachricht, aber es füllt das Antwortobjekt nicht ordnungsgemäß (alle seine Attribute sind Null). Ich schätze, das Problem könnte durch das Umbenennen der Antwortklassen entstehen, weshalb ich versuche, verschiedene Pakete zu erzeugen, die den ursprünglichen Namen aller Klassen behalten.

Um dies zu tun, schrieb ich die nächste Bindings-Datei, aber ich weiß nicht, was ich falsch mache, dass es nicht funktioniert.

bindings.xml Datei:

<?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> 

in der Maven-Datei Mein Konfigurationsteil ist die nächste, falls es sinnvoll ist:

<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> 

Wenn ich kompiliere mit diesen Bindungen Dateien , der gleiche Fehler erscheint. Also denke ich, dass es vielleicht nicht stimmt.

Haben Sie Fehler gefunden?

Danke.

+0

Nur ein Tipp: Sie können den "bindingFiles" Konfigurationsabschnitt vollständig entfernen, wenn Sie alle Ihre verbindlichen Dateien in src platzieren/jaxws! Sie werden dann automatisch vom jaxws-maven-plugin abgeholt. – headcr4sh

Antwort

7

Aus meiner Erfahrung ist es am besten, 2 Bindungsdateien zu erstellen (eine für jede WSDL-Datei). Ihre pom.xml entsprechend aktualisiert und stellen Sie sicher, dass das Wurzelelement der Bindungs ​​Dateien ist jaxws: Bindungen (und jaxb nicht: Bindings)

Einige Hinweise:

  1. Stellen Sie sicher, die festlegen "wsdlLocation" -Attribut korrekt! Es muss auf die WSDL-Datei verweisen, die einen relativen Pfad verwendet!
  2. Das Paket jaxws: bestimmt das Paket, das für die generierten Serviceklassen verwendet wird. (Das mit @WebService markierte Objekt)
  3. Aktivieren oder deaktivieren Sie wrapperStyle und asyncMapping, wie Sie möchten. ;-)

Beispiel Einbindemappe für "package1":

<?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

Vielen Dank !, das hat den Trick gemacht. Wichtig! Als ich das erste Mal kompilierte, dass das Plugin meine neue Paketkonfiguration ignorierte, weil es die vorherige aus meiner Pom-Datei verwendete, habe ich nach dem Entfernen von ' original.package verschiedene Pakete erstellt. Jedoch...Spring füllt mein Antwortobjekt nicht ordnungsgemäß aus, und ich kann in meiner Protokollierung sehen, dass die Antwort-SOAP-Nachricht korrekt ist, sodass diese Lösung mein Hauptproblem nicht löste. – maqjav