2010-08-25 12 views
44

L'utilizzo del codice generato con wsimport può annullare l'endpoint del servizio senza dover rigenerare il codice?sovrascrittura o impostazione di endpoint del servizio Web in fase di esecuzione per il codice generato con wsimport

Ho scritto un semplice webservice Java, seguendo i passaggi:

  1. compilo la classe Java e generare un file di guerra
  2. distribuire il file WAR alla mia application server (Tomcat)
  3. Accedere al WSDL tramite l'URL es localhost: 8080/servizio/HelloService WSDL
  4. utilizzare l'URL con wsimport.bat per generare classi client per esempio: wsimport http://localhost:8080/service/helloservice?Wsdl
  5. che uso quelle classi nel mio client app per chiamare il servizio

Il problema è che il servizio è distribuito su un app server in esecuzione su una porta diversa da 8080, la comunicazione tra client e servizi non avviene mai. Sto cercando di sapere qual è il modo migliore per creare stub che non hanno server e porta codificati nello stub utilizzato dal client.

+0

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

risposta

75

Il client può impostare il punto finale nella "porta" del servizio in fase di esecuzione tramite l'interfaccia BindingProvider.

Considerare il client JAX-WS in this JAX-WS tutorial. Un altro modo di scrivere questo codice sarebbe:

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: Non ho scaricato il codice tutorial e testato questo codice contro di essa.

+0

Grazie, questo è quello che stavo cercando. – user363808

+0

Sto guardando questo. Apparentemente con il codice generato con le versioni recenti di wsimport JAX-WS, il WSDL deve essere accessibile all'indirizzo specificato per wsimport al momento in cui viene eseguito 'new HelloService()' (molto prima che il provider di binding abbia anche una possibilità di kicking in). È l'unico modo per risolvere questo problema, per avere una copia locale del WSDL che può essere analizzata in modo che il costruttore abbia successo? –

+0

@ ThorbjørnRavnAndersen Se la memoria è utile, è possibile impostare la posizione WSDL su tutto ciò che si desidera al momento della generazione: consultare l'argomento '-wsdllocation' per [wsimport] (http://download.oracle.com/javase/6/docs/technotes/tools/# webservices). Ma generalmente lo fornirei esplicitamente in un client non gestito - [esempio] (http://illegalargumentexception.blogspot.co.uk/2011/04/java-jax-ws-web-services-and-clients.html#ws_client) . – McDowell

-1

Ho affrontato lo stesso problema, ed è stato terribile coz una volta che il codice viene spostato la produzione è sempre guardato per la posizione WSDL hardcoded cioè Windows C: ........ etc

ho andato attraverso vari post e pagine per trovare la risposta, ma tutto stava fallendo poi mi sono trovato un modo guardando la classe di servizio generata dalle importazioni JAX-WS.

Ho dovuto eseguire l'override dell'implementazione della posizione WSDL JAX-WS nella mia classe chiamante in questo modo.

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

Problemi correlati