2010-08-25 8 views
44

Kann der Service-Endpunkt mit Code, der mit wsimport generiert wurde, außer Kraft gesetzt werden, ohne dass der Code neu generiert werden muss?Überschreiben oder Festlegen des Web-Service-Endpunkts zur Laufzeit für mit wsimport generierten Code

ich einen einfachen Java-Webservice geschrieben habe, folgende sind die Schritte:

  1. ich die Java-Klasse zu kompilieren und eine WAR-Datei
  2. Stellen Sie das WAR-Datei zu meinem App-Server (Tomcat)
  3. erzeugen Greifen Sie über die URL zB auf die WSDL zu localhost: 8080/service/Hello Wsdl
  4. die URL mit wsimport.bat verwenden, um Client-Klassen zum Beispiel zu erzeugen: wsimport http://localhost:8080/service/helloservice?Wsdl
  5. ich diese Klassen in meiner Client-Anwendung verwenden, um den Dienst

Das Problem zu nennen Ist der Dienst auf einem App-Server implementiert, der auf einem anderen Port als 8080 ausgeführt wird, findet die Kommunikation zwischen Client und Dienst nie statt. Ich versuche zu wissen, was der beste Weg ist, Stubs zu erstellen, die nicht über Server und Port verfügen, die in dem Stub, der von dem Client verwandt wird, fest codiert sind.

+0

Verwandte Frage: http://stackoverflow.com/questions/3567856/changing-the-url-on-a-webservice-client-generated-with-wsimport – McDowell

Antwort

75

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

Betrachten Sie den JAX-WS-Client in this JAX-WS tutorial. Eine weitere 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); 

Caveat: Ich habe nicht das Tutorial Code heruntergeladen und getestet diesen Code dagegen.

+0

Danke, das ist, was ich gesucht habe. – user363808

+0

Ich schaue mir das an. Offenbar muss der WSDL mit Code, der mit den letzten Versionen von JAX-WS wsimport generiert wurde, unter der Adresse erreichbar sein, die wsimport zu dem Zeitpunkt angegeben wurde, an dem 'new HelloService()' ausgeführt wird (lange bevor der bindende Anbieter überhaupt eine Chance hat). Ist der einzige Weg, dies zu beheben, eine lokale Kopie der WSDL zu haben, die geparst werden kann, damit der Konstruktor erfolgreich ist? –

+0

@ ThorbjørnRavnAndersen Wenn Speicher verfügbar ist, können Sie den WSDL-Speicherort zum Generierungszeitpunkt beliebig festlegen - siehe das Argument '-wsdlocation' für den [wsimport] (http://download.oracle.com/javase/6/docs/technotes/tools/# webservices). Aber ich würde es im Allgemeinen explizit in einem nicht verwalteten Client bereitstellen - [Beispiel] (http://illegalargumenttexception.blogspot.co.uk/2011/04/java-jax-ws-web-services-and-clients.html#ws_client) . – McDowell

-1

stand ich vor dem gleichen Problem, und es war schrecklich Coz, wenn der Code zur Produktion bewegt wird es für die hartcodierte WSDL Lage zB Windows C immer aussah: ........ etc

Ich habe durch verschiedene Post und Seiten gegangen, um die Antwort zu finden, aber alles scheiterte, dann fand ich einen Weg, indem ich auf die Service-Klasse sah, die von JAX-WS-Importen erzeugt wurde.

Ich musste die JAX-WS WSDL-Standortimplementierung in meiner Aufrufklasse 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();

Verwandte Themen