Lässt man sich über das kleine JAX-WS Tool “wsimport” automatischen Java-Clientcode für einen WebService generieren, sind sowohl die WSDL-URL, als auch die Endpoint-URL im Clientcode fest hinterlegt. Das Erzeugen des Clients kann dann über einen parameterlosen Konstruktor erfolgen, was im ersten Moment verlockend einfach klingt.
Ändert sich nun die WSDL- oder gar die Endpoint-URL, so möchte man natürlich ungern den generierten Code per Hand ändern oder den Import ständig wiederholen. Noch spannender ist die Frage, wie man beide Parameter zur Laufzeit ändern kann. JAX-WS bietet glücklicherweise für diese Fälle entsprechende Lösungen.
WSDL-URL ändern
Die WSDL-URL ist der erste Anlaufpunkt des Clients. Hier holt er sich Informationen über die vom Service bereitgestellten Methoden und die Information, mit welcher Endpoint-URL der eigentliche Service anzusprechen ist.
Beim Erzeugen des Client über den parameterlosen Konstruktor wird die beim wsimport genutzte URL als Standard genommen. Es gibt aber auch einen Konstruktor, der die WSDL-URL und den Servicenamen übernimmt.
WebService webService = new WebService(wsdlLocation, serviceName);
Endpoint-URL ändern
In der WSDL-Datei wird die Endpoint-URL des Webservice propagiert. Also die URL, an die man die Methodenaufrufe dann schlussendlich richtet. Soll auch diese von außen überschrieben werden, lässt sich das Service-Binding nachträglich ändern.
((BindingProvider) webServicePort).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, newEndPointUrlAsString);