Frage

Ich versuche, ein Modul für eine Java-Anwendung zu schreiben, die auf einen von WSDL beschriebenen Webservice zugreift. Die Quelle WSDL wurde direkt von dem heruntergeladen, was ich für ein ASP.NET -Webservice halte. Die Service -URL endet in einer Erweiterung der ASMX, und die Anzeige der Service -URL in einem Browser zeigt einen Link an, mit dem das WSDL heruntergeladen werden kann.

Eine wichtige Voraussetzung für mich ist es, die Service -URL ohne Neukompetenz auszuschalten. Die mir gegebene URL ist offensichtlich ein Testserver und ich weiß, dass ich in der Produktion eine Produktions -URL zur Verwendung erhalten werde. Ich möchte auch in der Lage sein, selbst einen Mock -Server zum Testen zu erstellen und die Möglichkeit beizubehalten, in Zukunft eine neue URL anzugeben, ohne neu zu kompilieren, wenn der Dienst verschoben wird. In der Tat möchte ich eine Installation unserer Anwendung in der Lage sein, instanziieren zu können mehrere Instanzen des Webservice bei verschiedenen URLs.

Aber meine Konzeption scheint nicht mit dem übereinstimmen, was das WSIMport -Tool für mich tut. Folgt F1SHs Antwort hier, Ich habe Java -Code aus meinem heruntergeladenen WSDL mit diesem Befehl generiert:

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

Was ich finde, ist, dass der generierte Code einen festcodierten Verweis auf meine heruntergeladene wsdlfile.wsdl enthält, die die Service -URL enthält. Unsere Anwendung wird nicht so ausgeführt, dass sie durch Bearbeiten einer WSDL -Datei zur Laufzeit konfiguriert werden kann. Ich muss Code haben, der zum Zeitpunkt der Erstellung in meine Anwendung zusammengestellt wird und die Service -URL zur Instanziierung festlegen kann.

Ich bin mir nicht ganz sicher, warum die WSDL auch zur Laufzeit analysiert werden muss. Nach meinem Verständnis liefert WSDL genügend Informationen, um Code zu generieren, die auf den Webservice zugreifen können. Ich bin mir daher nicht sicher Ein Konstruktor oder konfigurierbar über eine Methode auf der generierten Webservice -Klasse. Mir muss etwas fehlen.

Was ist die allgemeine Praxis für dieses Szenario? Regenerieren die meisten Menschen den Code für jede einzelne URL, die sie verwenden werden? Wird der Code zur Laufzeit generiert? Gibt es ein weiteres WSDL -Tool, das ich verwenden kann, das Client -Code mit einer konfigurierbaren URL erstellt?

War es hilfreich?

Lösung

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

Kopieren Sie den aus Ihrer generierten Quelle. EIN QName ist ein XML qualifizierter Name - Eine "eindeutige" Identität.

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

Ich kann nicht sagen, dass ich es sicher weiß, aber ein WSDL ist im Grunde ein Schema. Wenn Sie es zur Verfügung stellen, geben Sie Jax-Ws einen Mechanismus zur Validierung der Seifenreaktion. Ich glaube nicht, dass die JAXB -Bindungen dafür ausreichen.

Ich verwende immer den Zwei-Argument-Konstruktor im generierten Dienst, um eine URL über die bereitzustellen Classloader.getResource Methode, um das WSDL in mein Glas einzubetten. Wie bei jedem Schema ist die Verwendung einer Remote- oder Dateisystem -URL dafür verwendet dumm Weniger als optimal.

Sehen Diese Frage, wie Sie den Endpunkt zur Laufzeit festlegen können:

HelloService service = new HelloService();
Hello port = service.getHelloPort();
BindingProvider bindingProvider = (BindingProvider) port;
bindingProvider.getRequestContext().put(
      BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
      "http://foo:8086/HelloWhatever");
String response = port.sayHello(name);

Andere Tipps

Diese Antwort hat mich seit ein paar Tagen entzogen, aber irgendwie konzentriert mich das Schreiben der Frage immer darauf, eine Antwort zu finden, und ein paar weitere WebSearchs haben darauf hingewiesen:

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

Es scheint, dass WSIMport eine Klasse erstellt hat, com.example.webservice, die javax.xml.ws.service erweitert. Diese WebService -Klasse hat zwei Konstruktoren. Der No-Arg-Konstruktor ist mit einer Datei fest codiert: // URL, um das ursprüngliche WSDL zu verwenden, aus dem ich generiert wurde. (Ich nehme an, wenn ich eine HTTPS: //-URL in der WSIMport-Befehlszeile geliefert hätte, wäre das die URL, die hartcodiert ist.) Alternativ kann ich einen Zwei-ARG-Konstruktor verwenden und zum Zeitpunkt der Instanziierung eine WSDL-URL liefern! Dieser Ansatz erfordert, dass ich auch ein javax.xml.namespace.qname -Objekt liefern kann, das ich noch nicht verstehe, als zweites Argument.

Die Verwendung dieses Zwei-ARG-Konstruktors wird mein Problem wahrscheinlich lösen.

Es scheint, dass WSIMport, das ich von JDK 1.6 verwende, Teil des JAX-WS-Pakets ist. JDK 1.6 enthält in jüngsten Versionen JAX-WS 2.1, und Jax-WS 2.2 wird die Schwierigkeiten, die ich in dieser Frage aufgeworfen habe, befassen.

Ich werde gerne jede Antwort akzeptieren, die einige oder alle anderen dieser Situation erklärt. Ich verstehe immer noch nicht, warum die WSDL zur Laufzeit benötigt wird. Praktischer würde es mir helfen, mir zu zeigen, wie man den Zwei-Argument-Konstruktor benutzt oder wie ich meinen Code mit JDK 1.6 und JAX-WS 2.2 generiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top