Come modificare l'endpoint dell'URL del servizio web?


101

Ho generato un client del servizio web utilizzando JBoss utils (compatibile JAX-WS) utilizzando il 'client del servizio web di Eclipse da un wsdl'.

Quindi, l'unica cosa che ho fornito è stato un URL per un servizio Web WSDL.

Ora, il provider di servizi web mi dice di cambiare l '"URL di accesso all'applicazione endpoint client" del servizio web.

Cos'è e come cambiarlo?


Puoi semplicemente ricreare la cosa usando la stessa procedura guidata di Eclipse con il nuovo URL?
Thilo

Indica al fornitore di servizi web che hai bisogno del nuovo URL per wsdl, quindi usalo con la procedura guidata Eclipse per rigenerare il client.
systempuntoout

@Thilo @systemputoout RAGAZZI, il problema è che hanno LO STESSO URL WSDL !! Non ne sono sicuro, ma mi sembra che in Axis sia possibile fornire un URL quando si richiama il servizio web. In JAX-WS non è possibile modificare "l'endpoint client durante il runtime". Qualche idea, ragazzi?
EugeneP

1
@ Pascal Thivent, @systempuntoout Cite: "URL o endpoint per l'accesso all'applicazione client"
EugeneP

1
Bene, la mia comprensione di questa frase è "i client accedono a un endpoint del servizio; la posizione dell'endpoint è cambiata". E questo ha senso.
Pascal Thivent

Risposte:


174

IMO, il provider ti sta dicendo di cambiare l'endpoint del servizio (cioè dove raggiungere il servizio web), non l'endpoint del client (non capisco cosa potrebbe essere). Per modificare l'endpoint del servizio, hai fondamentalmente due opzioni.

Utilizza il provider di binding per impostare l'URL dell'endpoint

La prima opzione è modificare il BindingProvider.ENDPOINT_ADDRESS_PROPERTYvalore della proprietà di BindingProvider(ogni proxy implementa l' javax.xml.ws.BindingProviderinterfaccia):

...
EchoService service = new EchoService();
Echo port = service.getEchoPort();

/* Set NEW Endpoint Location */
String endpointURL = "http://NEW_ENDPOINT_URL";
BindingProvider bp = (BindingProvider)port;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);

System.out.println("Server said: " + echo.echo(args[0]));
...

Lo svantaggio è che funziona solo quando il WSDL originale è ancora accessibile. Non consigliato.

Utilizza WSDL per ottenere l'URL dell'endpoint

La seconda opzione è ottenere l'URL dell'endpoint dal WSDL.

...
URL newEndpoint = new URL("NEW_ENDPOINT_URL");
QName qname = new QName("http://ws.mycompany.tld","EchoService"); 

EchoService service = new EchoService(newEndpoint, qname);
Echo port = service.getEchoPort();

System.out.println("Server said: " + echo.echo(args[0]));
...

7
Penso che ci sia un errore nel secondo blocco di codice, non dovrebbe essere URL newEndpoint = new URL ("WSDL_URL"); in prima riga ??
Jaime Hablutzel

3
ecco un collegamento a un tutorial tugdualgrall.blogspot.com/2009/02/…
shareef

12
Vale la pena sottolineare che gli wsimportstrumenti moderni non generano più codice con un get[Service]Portmetodo. Invece, chiama get[Service]ed esegui il cast dell'oggetto risultante su a BindingProviderper impostare questi tipi di proprietà.
Christopher Schultz

Grazie @ChristopherSchultz per il suggerimento di wsimport! Quella def. ha lavorato per noi
Cuga

1
Per quanto ho capito dal codice stub generato da cxf, la seconda opzione sopra cambia l'URL di WSDL, non l'URL del servizio. Mi sto perdendo qualcosa?
cacert

16

Per aggiungere qualche chiarimento qui, quando crei il tuo servizio, la classe del servizio utilizza il valore predefinito 'wsdlLocation', che è stato inserito al suo interno quando la classe è stata creata da wsdl. Quindi, se hai una classe di servizio chiamata SomeService e crei un'istanza come questa:

SomeService someService = new SomeService();

Se guardi dentro SomeService, vedrai che il costruttore ha questo aspetto:

public SomeService() {
        super(__getWsdlLocation(), SOMESERVICE_QNAME);
}

Quindi, se vuoi che punti a un altro URL, usa semplicemente il costruttore che accetta un argomento URL (ci sono 6 costruttori per l'impostazione di qname e anche delle caratteristiche). Ad esempio, se hai impostato un monitor TCP / IP locale che è in ascolto sulla porta 9999 e desideri reindirizzare a quell'URL:

URL newWsdlLocation = new URL("http://theServerName:9999/somePath");
SomeService someService = new SomeService(newWsdlLocation);

e questo chiamerà questo costruttore all'interno del servizio:

public SomeService(URL wsdlLocation) {
    super(wsdlLocation, SOMESERVICE_QNAME);
}

2
Non necessariamente. Ho servizi generati con wsdl2java di Apache CXF e anche quando passiamo la nuova posizione di wsdl al costruttore, le sue porte tentano ancora di collegarsi alla posizione impostata al momento della compilazione / generazione (senza lasciare altra scelta se non quella di typecast la porta su BindingProvider e impostare il nuovo indirizzo nella sua mappa di contesto della richiesta.)
luis.espinal

1
@Luis - Difficile sapere esattamente cosa stai vedendo, ma se esegui il debug dovresti vedere la chiamata nella classe Provider javax, e poi vederlo provare a creare l'endpoint con la tua nuova posizione wsdl (supponendo che tu stia usando JAX-WS 2.0 +). Quindi all'interno del tuo servizio, la chiamata getPort dovrebbe chiamare super.getPort, che utilizza la tua nuova porta impostata in un oggetto serviceDelegate. È così che dovrebbe funzionare con javax.xml.ws.Service in JAX-WS 2.0. Metterei un punto di interruzione sulla super chiamata e indagherei da lì.
MattC

0

Non andrei così lontano come @Femi per modificare la proprietà dell'indirizzo esistente. Puoi aggiungere facilmente nuovi servizi alla sezione delle definizioni.

<wsdl:service name="serviceMethodName_2">
  <wsdl:port binding="tns:serviceMethodNameSoapBinding" name="serviceMethodName">
    <soap:address location="http://new_end_point_adress"/>
  </wsdl:port>
</wsdl:service>

Ciò non richiede una ricompilazione del WSDL in Java e fare gli aggiornamenti non è più difficile che se si usasse l'opzione BindingProvider (che non ha funzionato per me btw).


-6

Per modificare la proprietà dell'indirizzo finale, modifica il tuo file wsdl

<wsdl:definitions.......
  <wsdl:service name="serviceMethodName">
    <wsdl:port binding="tns:serviceMethodNameSoapBinding" name="serviceMethodName">
      <soap:address location="http://service_end_point_adress"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

11
In molti casi, il WSDL ti viene imposto e non dovresti cambiarlo. Ancora più importante, da un ambiente a un altro (test vs live), è probabile che l'URL dell'endpoint cambi .. e nessuno vuole modificare il wsdl e ricompilare in questo caso.
Myobis
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.