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.