Generierung WebService-Client für mehrere WSDLs mit Maven
Um die Java-Klassen für WebService-Clients zu generieren empfiehlt sich das JAX-WS-Plugin für Maven. Dieses klinkt sich bei Verwendung von “wsimport” in die Build-Phase “generate-sources” ein.
Für mich ist es sinnvoll, die WSDL-Dateien des anzusprechenden Services direkt in “src/wsdl” meines Projekts abzulegen statt diese über eine URL einzubinden. Dies hat den Vorteil, dass ich Änderungen an der Schnittstelle des Service in der Subversion-Historie nachvollziehen kann. Muss mein Projekt mehrere Service ansprechen, so lege ich die WSDL- plus die Schema-Datei (XSD) jedes Service im genannten Verzeichnis ab.
Ich verwende pro Service im Client-Projekt eine JAXB-Binding-Datei um ein Mapping von Datentypen der Service-Schnittstelle auf bestehende Java-Klassen zu definieren. Diese Binding-XML-Dateien liegen per Default des JAXWS-Plugins im Verzeichnis “src/jaxws”. So sieht zum Bsp eine solche Mapping-Datei bei mir aus:
<?xml version="1.0"?>
<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:bindings schemaLocation="../wsdl/Service1_schema1.xsd" node="/xs:schema">
<jxb:bindings node="//xs:complexType[@name='type1']">
<jxb:class ref="com.corp.package.Type1" />
</jxb:bindings>
<jxb:bindings node="//xs:complexType[@name='type2']">
<jxb:class ref="com.corp.package.Type2" />
</jxb:bindings>
<jxb:bindings node="//xs:simpleType[@name='typeEnum']">
<jxb:typesafeEnumClass ref="com.corp.package.TypeEnum" />
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
Ist in der pom.xml das JAX-WS-Plugin ohne zusätzliche Einstellungen (also Defaults) für “wsimport” eingebunden, so gibt es den folgenden Fehler:
[ERROR] "file:/[...]_schema1.xsd" is not a part of this compilation. Is this a mistake for "file:/[...]Service_schema1.xsd"? line 5 of file:/[...]bindings_[...].xml
Um diesen Fehler zu vermeiden, muss Maven das JAX-WS-Plugin für jede WSDL-Datei getrennt in Verbindung mit der richtigen JAXB-Binding-Datei aufrufen.
Dies kann in der pom.xml durch Konfiguration nach folgendem Schema erreicht werden:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>1.11</version>
<executions>
<execution>
<id>wsimport Service1</id>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<staleFile>${project.build.directory}/jaxws/stale/wsdl.Service1.done</staleFile>
<packageName>com.corp.package1</packageName>
<wsdlFiles>
<wsdlFile>Service1.wsdl</wsdlFile>
</wsdlFiles>
<bindingFiles>
<bindingFile>bindings_service1.xml</bindingFile>
</bindingFiles>
</configuration>
</execution>
<execution>
<id>wsimport Service2</id>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<staleFile>${project.build.directory}/jaxws/stale/wsdl.Service2.done</staleFile>
<packageName>com.corp.package2</packageName>
<wsdlFiles>
<wsdlFile>Service2.wsdl</wsdlFile>
</wsdlFiles>
<bindingFiles>
<bindingFile>bindings_service2.xml</bindingFile>
</bindingFiles>
</configuration>
</execution>
</executions>
</plugin>
Die Java-Klassen für den WebService-Client liegen dann unter “target/jaxws/import”. Ich hoffe mit diesen Zeilen kann ich wieder ein paar armen Seelen helfen, Aspirin zu sparen.
am 1. October 2009 um 23:17 Uhr.
Na das sind doch mal gute Nachrichten, dass jemand soetwas postet. Sehr interessant! Danke vielmals!