Dynamischer Web Service und ClassLoader

meddins

Grünschnabel
Guten Tag,

ich bin zur Zeit dabei einen dynamischen Web Service zu schreiben. Dazu lese ich eine XML Datei aus und schreibe daraus Java Quellqode, der dann einen WebService darstellt. Dafür nutze ich JAX-WS um den WebService einfach mithilfe von Annotationen zu erstellen. Nach dem generieren des Quellcodes compiliere ich ihn und und lasse anschließend das wsgen tool drüber laufen um die stub Klassen zu erzeugen. Mein Problem ist jetzt, dass ich diese Stub Klassen dynamisch laden muss. Das habe ich auch getan mit einem URLClassLoader aber wenn ich den WebService mit hilfe von Endpoint pubishen will, wird mir eine Fehlermeldung ausgegeben, mit dem Inhalt, dass die Klassen nicht gefunden wurden.

Hier ist ein auszug aus dem Quellcode, der das laden und das publizieren betrifft.

Code:
URLClassLoader cl = new URLClassLoader(new URL[] { url }, Thread.currentThread().getContextClassLoader());

//laden der dynamisch erzeugten klassen ....

//laden der WebSerivce Klasse
Class<?> serviceClass = cl.loadClass(servicename);
Constructor<?> construktor = serviceClass.getConstructor();
Object o = construktor.newInstance();

//publishen des WebServices
Endpoint endpoint = Endpoint.publish(URL + servicename, o);

Das laden der Klassen funktioniert einwandfrei, ich sehe sie beim debuggen im Classloader aber sie werden beim erstellen des Endpoints nicht gefunden. Außerdem kann ich auch nicht auf die Klassen mit Class.forName zugreifen. Kann mir da vielleicht einer weiterhelfen? Ich weiß nämlich momentan wirklich nicht weiter.

Außerdem würde mich noch interresieren, ob man außer der automatisch bereitgestellen WSDL, unter der URL des WebServices eine WSDL auf anderem Weg erstellen kann. Da die von JAX-WS generierte WSDL anscheinend nicht ganz valide ist.

Gruß meddins
 
Zuletzt bearbeitet:
Hallo,

versuch doch mal vor dem erzeugen des Endpoints deinen neuen ClassLoader als Thread.currentThread().setContextClassLoader(cl) zu setzen.

Wo knallts denn genau? Beim Endpoint.publish(...)?

Gruß Tom
 
Hey,

Danke, für die schnelle Antwort. Das hat sofort funktioniert. Es hat immer beim Endpoint.publish() geknallt. Ich bin da seit einigen Tagen dran habe aber bis jetzt nirgends was dazu gefunden. Es wurde immer gezeigt, wie man Klassen laden und direkt mit reflection nutzen kann aber nichts weiterführendes :(.

Passt jetzt nicht ganz zum Thema aber weiß jemand zufällig noch was wegen dem generieren einer wsdl. Außer der WSDL, die automatisch beim erstellen des Endpunktes generiert wird, bzw kann man die erstellung der WSDL beieinflussen, wie zum Beispiel zu vermeiden externe Schemadefinitionen zu verwenden? Ich habe kurz das cfx framework dafür genutzt aber dann müsste ich jar files von insgesamt 22MB mit in mein Projekt packen und das würde ich gerne vermeiden.

Gruß meddins
 
Zurück