it-swarm.com.de

überschreiben oder Festlegen des Web-Service-Endpunkts zur Laufzeit für mit wsimport generierten Code

Kann der Service-Endpunkt mit Code, der mit wsimport generiert wurde, überschrieben werden, ohne den Code neu generieren zu müssen?

Ich habe einen einfachen Java-Webservice geschrieben, der folgende Schritte ausführt:

  1. Ich kompiliere die Java-Klasse und generiere eine Kriegsdatei
  2. Bereitstellen der War-Datei auf meinem App-Server (Tomcat)
  3. Greifen Sie auf die WSDL über die URL zu, z. localhost: 8080/service/helloservice? wsdl
  4. verwenden Sie die URL mit wsimport.bat, um Client-Klassen zu generieren. Beispiel: wsimport http://localhost:8080/service/helloservice?Wsdl
  5. Ich benutze diese Klassen in meiner Client-App, um den Dienst aufzurufen

Das Problem ist, dass der Dienst auf einem App-Server bereitgestellt wird, der auf einem anderen Port als 8080 ausgeführt wird. Die Kommunikation zwischen Client und Dienst findet nie statt. Ich versuche zu wissen, wie der beste Weg ist, Stubs zu erstellen, die Server und Port nicht fest in dem vom Client verwendeten Stub enthalten.

51
user363808

Ihr Client kann den Endpunkt im Service "Port" zur Laufzeit über die BindingProvider - Schnittstelle einstellen.

Betrachten Sie den JAX-WS-Client in diesem JAX-WS-Lernprogramm . Eine andere Möglichkeit, diesen Code zu schreiben, wäre:

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);

Warnung: Ich habe den Tutorialcode nicht heruntergeladen und mit diesem Code getestet.

82
McDowell

Ich war mit dem gleichen Problem konfrontiert, und es war schrecklich, wenn der Code in die Produktion verschoben wurde. Er suchte immer nach dem hartcodierten WSDL-Speicherort, d. H. Windows C: ........ etc

Ich bin durch verschiedene Posts und Seiten gegangen, um die Antwort zu finden, aber alles scheiterte, dann fand ich einen Weg, indem ich mir die Service-Klasse ansah, die von JAX-WS-Importen generiert wurde.

Ich musste die JAX-WS WSDL-Standortimplementierung in meiner aufrufenden Klasse wie folgt überschreiben.

URL baseUrl;
URL wsdlURL = null;
baseUrl = <your Services>.class.getResource(".");
try {
    wsdlURL = new URL(baseUrl, "http://<your path>?wsdl");
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
}

<your Services> yourServices = new <your Services(wsdlURL,new QName("your namespace", "<your service name>"));
System.out.println(Services.getWSDLDocumentLocation());
YourInterface YourInterfacePort =  yourServices.getServicePort();
BindingProvider bindingProvider = (BindingProvider)YourInterfacePort;
bindingProvider.getRequestContext().put(
          BindingProvider.ENDPOINT_ADDRESS_PROPERTY,      url);

YourInterfacePort.methods ();

0
user3749126