2010-08-25 4 views
10

Ich versuche ein Modul für eine Java-Anwendung zu schreiben, die auf einen von WSDL beschriebenen Webservice zugreift. Die Quell-WSDL wurde direkt von einem meiner Meinung nach ASP.NET-Webservice heruntergeladen. Die Service-URL endet mit der Erweiterung .asmx. Wenn Sie die Service-URL in einem Browser anzeigen, wird ein Link angezeigt, über den Sie die WSDL herunterladen können.Ändern der URL eines Webservice-Clients, der mit wsimport generiert wurde

Eine wichtige Voraussetzung für mich ist es, die Service-URL ohne Neukompilierung wechseln zu können. Die mir angegebene URL ist offensichtlich ein Testserver und ich weiß, dass ich in der Produktion eine Produktions-URL erhalten werde. Ich möchte auch in der Lage sein, selbst einen Mock-Server zum Testen zu erstellen und die Möglichkeit zu behalten, in der Zukunft eine neue URL anzugeben, ohne sie neu zu kompilieren, wenn der Dienst verschoben wird. Tatsächlich möchte ich für eine Installation unserer Anwendung in der Lage sein, mehrere Instanzen des Webservice unter verschiedenen URLs zu instanziieren.

Aber meine Vorstellung scheint nicht mit dem übereinzustimmen, was das wsimport-Tool für mich tut. Nach f1sh Antwort here erzielen ich Java-Code von meinem heruntergeladen WSDL mit diesem Befehl:

wsimport -Xnocompile -keep -b binding.xml wsdlFile.wsdl 

Was ich finde, ist, dass der erzeugte Code einen hartcodierte Bezug auf meinen heruntergeladen wsdlFile.wsdl hat, die die Service-URL enthält. Unsere Anwendung wird nicht so laufen, dass sie durch Bearbeiten einer WSDL-Datei zur Laufzeit konfiguriert wird. Ich benötige Code, der zum Zeitpunkt der Erstellung in meine Anwendung kompiliert wird und die Service-URL zur Instanziierungszeit festlegen kann.

Ich bin nicht ganz sicher, warum die WSDL zur Laufzeit sogar geparst werden muss; Ich habe verstanden, dass WSDL genügend Informationen liefert, um Code zu generieren, der auf den Webservice zugreifen kann. Daher bin ich mir nicht sicher, was es für den generierten Code außer der Service-URL liefert und ich bin nicht sicher, warum die Service-URL nicht bereitgestellt wird ein Konstruktor oder über eine Methode auf der generierten Webservice-Klasse konfigurierbar. Ich muss etwas verpassen.

Was ist die allgemeine Praxis für dieses Szenario? Generieren die meisten Benutzer den Code für jede einzelne URL, die sie verwenden werden? Wird Code zur Laufzeit generiert? Gibt es ein anderes WSDL-Tool, das ich verwenden kann, um Client-Code mit einer konfigurierbaren URL zu erstellen?

Antwort

3

Dieser Ansatz erfordert, dass ich auch ein javax.xml.namespace.QName-Objekt, das ich noch nicht verstehe, als zweites Argument angeben.

Kopieren Sie den aus Ihrer generierten Quelle. A QName ist ein XML qualified name - eine "eindeutige" Identität.

Ich verstehe immer noch nicht, warum die WSDL zur Laufzeit benötigt wird.

Ich kann nicht sagen, ich weiß es sicher, aber eine WSDL ist im Grunde ein Schema. Ich schätze, Sie geben JAX-WS einen Mechanismus, um die SOAP-Antwort zu validieren. Ich denke nicht, dass die JAXB-Bindungen dafür ausreichen.

Ich verwende immer den Konstruktor mit zwei Argumenten im generierten Service, um eine URL über die Methode bereitzustellen, um die WSDL in mein Jar einzubetten. Wie bei jedem Schema ist die Verwendung einer Remote- oder Dateisystem-URL dafür dumm weniger als optimal.

Siehe this question for how to set the end-point at runtime.

10

Diese Antwort wurde für ein paar Tage eluding mich, aber irgendwie der Akt des Schreibens die Frage immer konzentriert sich mir eine Antwort auf der Suche, und ein paar mehr websearches haben wies darauf hin:

http://www.fransvanbuul.net/?p=98

Es scheint, dass wsimport eine Klasse namens com.example.WebService erstellt hat, die javax.xml.ws.Service erweitert. Diese WebService-Klasse verfügt über zwei Konstruktoren. Der no-arg-Konstruktor ist fest mit einer file: // URL codiert, um die ursprüngliche WSDL zu verwenden, von der ich generiert habe. (Ich nehme an, wenn ich eine https: // URL in der wsimport-Befehlszeile angegeben hätte, wäre das die URL, die fest codiert ist.) Alternativ kann ich einen Konstruktor mit zwei Argumenten verwenden und eine WSDL-URL zur Instanziierungszeit angeben! Dieser Ansatz erfordert, dass ich ein javax.xml.namespace.QName-Objekt, das ich noch nicht verstehe, als zweites Argument zur Verfügung stelle.

Die Verwendung dieses Konstruktors mit zwei Argumenten löst wahrscheinlich mein Problem.

Es scheint, dass wsimport, die ich von JDK 1.6 verwende, ein Teil des JAX-WS-Pakets ist. JDK 1.6, in neueren Versionen, enthält JAX-WS 2.1, und JAX-WS 2.2 wird die Schwierigkeiten behandeln, die ich in dieser Frage aufwerfe.

Ich werde glücklich sein, jede Antwort zu akzeptieren, die einige oder den ganzen Rest dieser Situation erklärt. Ich verstehe immer noch nicht, warum die WSDL zur Laufzeit benötigt wird.Praktischerweise würde es mir helfen, wenn jemand mir zeigt, wie man den Konstruktor mit zwei Argumenten verwendet oder wie ich meinen Code mit JDK 1.6 und JAX-WS 2.2 erzeuge.

Verwandte Themen