Wenn ich einen Webservice-Client mit wsdl2java aus CXF (der etwas Ähnliches wie wsimport generiert) über maven generiere, beginnen meine Dienste mit folgenden Codes:
@WebServiceClient(name = "StatusManagement",
wsdlLocation = "c:/some_absolute_path_to_a_wsdl_file.wsdl",
targetNamespace = "http://tempuri.org/")
public class StatusManagement extends Service {
public final static URL WSDL_LOCATION;
public final static QName SERVICE = new QName("http://tempuri.org/", "StatusManagement");
public final static QName WSHttpBindingIStatus = new QName("http://tempuri.org/", "WSHttpBinding_IStatus");
static {
URL url = null;
try {
url = new URL("c:/some_absolute_path_to_a_wsdl_file.wsdl");
} catch (MalformedURLException e) {
System.err.println("Can not initialize the default wsdl from c:/some_absolute_path_to_a_wsdl_file.wsdl");
// e.printStackTrace();
}
WSDL_LOCATION = url;
}
Der fest codierte absolute Pfad ist wirklich scheiße. Die generierte Klasse funktioniert auf keinem anderen Computer als meinem.
Die erste Idee ist, die WSDL-Datei (plus alles, was sie importiert, andere WSDLs und XSDs) irgendwo in eine JAR-Datei zu legen und sie zu klassifizieren. Aber das wollen wir vermeiden. Da all das von CXF und JAXB basierend auf den WSDLs und XSDs generiert wurde, sehen wir keinen Grund, die WSDL zur Laufzeit kennen zu müssen.
Das wsdlLocation-Attribut soll den WSDL-Speicherort überschreiben (zumindest habe ich dies irgendwo gelesen), und der Standardwert ist "". Da wir maven verwenden, haben wir versucht, <wsdlLocation></wsdlLocation>
in die Konfiguration von CXF aufzunehmen, um den Quellgenerator zu zwingen, die wsdlLocation leer zu lassen. Dadurch wird das XML-Tag jedoch einfach ignoriert, da es leer ist. Wir haben einen wirklich hässlichen, beschämenden Hack gemacht <wsdlLocation>" + "</wsdlLocation>
.
Dies ändert auch andere Orte:
@WebServiceClient(name = "StatusManagement",
wsdlLocation = "" + "",
targetNamespace = "http://tempuri.org/")
public class StatusManagement extends Service {
public final static URL WSDL_LOCATION;
public final static QName SERVICE = new QName("http://tempuri.org/", "StatusManagement");
public final static QName WSHttpBindingIStatus = new QName("http://tempuri.org/", "WSHttpBinding_IStatus");
static {
URL url = null;
try {
url = new URL("" + "");
} catch (MalformedURLException e) {
System.err.println("Can not initialize the default wsdl from " + "");
// e.printStackTrace();
}
WSDL_LOCATION = url;
}
Meine Fragen sind also:
Benötigen wir wirklich einen WSDL-Speicherort, auch wenn alle Klassen von CXF und JAXB generiert wurden? Wenn ja, warum?
Wenn wir den WSDL-Speicherort nicht wirklich benötigen, wie kann CXF ihn dann ordnungsgemäß und sauber nicht generieren und vollständig vermeiden?
Welche schlimmen Nebenwirkungen könnten wir mit diesem Hack bekommen? Wir können das immer noch nicht testen, um zu sehen, was passiert. Wenn also jemand im Voraus sagen könnte, wäre es schön.
classpath:
in der<wsdlLocation...
Zeile weg .