Auflösen von Konflikten bei der Generierung von code mit CXF und wsdl2java

Bin ich zu kämpfen mit einigen Konflikten während der code-Generierung aus einer Reihe von WSDL-Dateien mit wsdl2java über das cxf-codegen-plugin mit Maven. Die WSDLs erklären verschiedene APIs für das gleiche system, und der generierte code hat eine gewisse Menge an überschneidungen (vor allem mit den model-Klassen). Das externe system und die WSDLs kommen von Dritten und sind daher nicht von uns kontrolliert werden.

Das erste problem ich habe, ist ein Namenskonflikt in einem der resultierende ObjectFactory Klassen, verursacht durch eine der WSDLs. Es definiert einen complexType mit dem Namen Foo enthält ein element mit dem Namen Status, und es definiert auch ein element mit dem Namen FooStatus. Beim generieren des Codes, JAXB wirft einen Anfall, weil die ObjectFactory hätte zwei factory-Methoden mit den Namen createFooStatus(...) und ich am Ende mit einer Ausnahme während der Laufzeit. Ich habe versucht, die Bereitstellung der option -autoNameResolution zu wsdl2java ohne Erfolg. Ich habe "Zwei Erklärungen verursachen einer Kollision in der ObjectFactory-Klasse" und "Die Anwendung des externen JAXB binding-Datei schema-Elemente importiert aus WSDL", und basierend auf denen, die ich geschrieben habe eine externe verbindlich-Datei, benennt einer der factory-Methoden. Ich benutze SCD statt XPath-in der Bindung-Datei, wie gezeigt, im letzteren link, da hatte ich das gleiche problem mit XPath als der Autor. Das funktioniert auch, aber nur, wenn ich mit den WSDL-Dateien einzeln und anwenden die verbindlichen Datei nur, um die WSDL, die Ursachen des Konflikts. Die Maven-Konfiguration sieht so aus:

<plugin>
  <groupId>org.apache.cxf</groupId>
  <artifactId>cxf-codegen-plugin</artifactId>
  <version>3.0.0-milestone1</version>
  <executions>
    <execution>
      <id>generate-proxies</id>
      <phase>generate-sources</phase>
      <configuration>
        <wsdlOptions>
          <wsdlOption>
            <wsdl>${basedir}/First.wsdl</wsdl>
            <bindingFiles>
              <bindingFile>${basedir}/bindings.xml</bindingFile>
            </bindingFiles>
          </wsdlOption>
          <wsdlOption>
            <wsdl>${basedir}/Second.wsdl</wsdl>
          </wsdlOption>
          <wsdlOption>
            <wsdl>${basedir}/Third.wsdl</wsdl>
          </wsdlOption>
          ... More wsdlOption declarations ...
        </wsdlOptions>
      </configuration>
      <goals>
        <goal>wsdl2java</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Nun, wenn ich dies Tue ich hier mit einem problem, denn der generierte code aus den verschiedenen WSDL-Dateien verwendet die gleiche package-Struktur. Was dies bedeutet in der Praxis, dass die ObjectFactory Klassen erhalten außer Kraft gesetzt, wenn die Verarbeitung spätere WSDL-Dateien, was bedeutet, dass nur die eine erzeugt aus den letzten WSDL existieren wird nach der plugin-Ausführung. Ich weiß, dass ich könnte, ändern Sie die target-package-Struktur, aber der code generiert sich aus der unterschiedlichen WSDLs hat eine Menge überschneidungen, und es wäre dumm fühle, es zu duplizieren. Ich habe auch versucht, mit Hilfe der -keep wsdl2java option, aber das scheint nicht, etwas zu tun (oder zumindest die ObjectFactory - Klassen bekommen immer noch überschrieben). Mein Verständnis ist, dass die Lösung wäre, zu verarbeiten aller WSDLs in einem Rutsch mit einem Maven-Konfiguration wie diese (zeigt nur die Konfigurations-Sektion, alles andere bleibt gleich):

<configuration>
  <defaultOptions>
    <bindingFiles>
      <bindingFile>${basedir}/bindings.xml</bindingFile>
    </bindingFiles>
  </defaultOptions>
  <wsdlRoot>${basedir}</wsdlRoot>
  <includes>
    <include>*.wsdl</include>
  </includes>
</configuration>

Jedoch diese Ergebnisse in einem com.sun.istack.SAXParseException2 sagen, dass mein SCD-expression doesn ' T match any schema-Komponente (da das schema-Komponente existiert nur in einem der WSDLs).

Kann ich das Ergebnis bekommen, das ich will, wenn ich änderungen an der WSDL-Datei selbst und das letztere Maven-Konfiguration, ohne die binding-Datei. Dadurch werden die resultierenden ObjectFactory ist ein Zusammenführen von denen, die entstehen würden, wenn die Verarbeitung der WSDLs individuell mit der ersten Maven config. Allerdings würde ich das eher nicht tun, sondern möchte, schafft das mit einem externen binding-Datei. Wie gehe ich bei der Problemlösung? Kann ich schreiben, die binding-Datei, so dass keine Ausnahme ausgelöst wird, wenn das entsprechende schema-Komponente wird nicht gefunden? Oder kann ich den Prozess der WSDLs individuell und überschreiben nicht die ObjectFactory Klassen? Oder muss ich einfach haben, um es aufzusaugen und entweder den code erzeugen, der aus verschiedenen WSDLs in andere Pakete oder ändern Sie die WSDL-Dateien selbst? Nur für den Fall es eine Rolle spielt, meine aktuelle Bindung-Datei sieht wie folgt aus (die WSDLs in Ihrem Innern befindet sich mein Projekt in das gleiche Verzeichnis mit dem binding-Datei):

<bindings scd="x-schema::tns" xmlns:tns="NamespaceOfFoo" xmlns="http://java.sun.com/xml/ns/jaxb" version="2.1">
  <bindings scd="tns:FooStatus">
    <factoryMethod name="FooStatusType"/>
  </bindings>
</bindings>
  • -autoNameResolution meinen Tag gerettet mit meinen eigenen WSDL. Danke !
Schreibe einen Kommentar