Da haben wir sie, die WSDL-Datei mit dem Namen “SampleWebService.wsdl”.
WSGEN – das Problem
Manchmal steht nur das Interface für den Webservice zur Verfügung, also nur die Datei SampleWebService.java. Wenn wir versuchen, daraus eine WSDL-Datei zu erzeugen, erscheint so eine Fehlermeldung:
WSGEN und ServiceInterface
1234567891011
$ wsgen -cp . SampleWebService -wsdl -inlineSchemas
The class "SampleWebService" is not an endpoint implementation class.
Usage: WSGEN [options] <SEI>
where [options] include:
-classpath <path> specify where to find input class files
...
Examples:
wsgen -cp . example.Stock
wsgen -cp . example.Stock -wsdl -servicename {http://mynamespace}MyService
Wie’s aussieht funktioniert WSGEN also nicht mit Interface-Klassen, es wird eine Implementierungsklasse benötigt:
$ javac AbstractSampleWebServiceImpl.java
$ wsgen -cp . AbstractSampleWebServiceImpl -wsdl -inlineSchemas
...
com.sun.tools.internal.ws.processor.modeler.ModelerException: modeler error: Classes annotated with @javax.jws.WebService must not be abstract. Class: AbstractSampleWebServiceImpl
...
Dynamische Erstellung einer Implementierungsklasse
Der nächste Versuch sieht so aus:
ich lade das Interface und untersuche alle seine Methoden
daraus erzeuge ich den Quelltext für eine Implementierungsklasse
die Implementierungsklasse kompiliere ich mit dem JavaCompiler
auf die dabei erstellte .class-Datei lasse ich dann wsgen los
Den Versuch habe ich in einem GITHUB-Projekt plattformübergreifend umgesetzt. Er scheint grundsätzlich zu funktionieren, ich kann in meinem aktuellen Projekt auf die manuelle Erstellung von Dummy-Implementierungsklassen verzichten.