web-dev-qa-db-fra.com

Comment modifier le point de terminaison de l'URL du service Web?

J'ai généré un client de service Web à l'aide de JBoss utils (compatible JAX-WS) À l'aide du 'client de service Web Eclipse à partir d'un wsdl'.

Ainsi, la seule chose que j'ai fournie était une URL à un service Web WSDL.

À présent, le fournisseur de services Web me dit de modifier "l'URL de l'accès aux applications client" du service Web.

De quoi s'agit-il et comment le changer?

88
EugeneP

Messagerie Internet uniquement, le fournisseur vous demande de modifier le point de terminaison du service (c'est-à-dire où accéder au service Web), pas le point de terminaison client (je ne comprends pas ce que cela pourrait être). Pour changer le point de terminaison du service, vous avez essentiellement deux options.

Utilisez le fournisseur de liaisons pour définir l'URL du noeud final

La première option consiste à modifier la valeur de la propriété BindingProvider.ENDPOINT_ADDRESS_PROPERTY de la BindingProvider (chaque proxy implémente l'interface javax.xml.ws.BindingProvider):

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

L'inconvénient est que cela ne fonctionne que lorsque le WSDL d'origine est toujours accessible. Non recommandé.

Utilisez le WSDL pour obtenir l'URL du noeud final

La deuxième option consiste à obtenir l'URL du noeud final à partir du 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]));
...
155
Pascal Thivent

Pour ajouter quelques précisions, lorsque vous créez votre service, la classe de service utilise la valeur par défaut 'wsdlLocation', qui lui a été insérée lors de la construction de la classe à partir de wsdl. Donc, si vous avez une classe de service appelée SomeService et que vous créez une instance comme celle-ci:

SomeService someService = new SomeService();

Si vous regardez dans SomeService, vous verrez que le constructeur ressemble à ceci:

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

Donc, si vous voulez qu'il pointe vers une autre URL, utilisez simplement le constructeur qui prend un argument d'URL (il y a 6 constructeurs pour la définition de qname et de fonctionnalités également). Par exemple, si vous avez configuré un moniteur TCP/IP local qui écoute sur le port 9999 et que vous souhaitez rediriger vers cette URL:

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

et cela appellera ce constructeur à l'intérieur du service:

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

Je n'irais pas aussi loin que @Femi pour change la propriété d'adresse existante. Vous pouvez facilement ajouter de nouveaux services à la section des définitions.

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

Cela ne nécessite pas une recompilation du WSDL en Java et les mises à jour ne sont pas plus difficiles que si vous utilisiez l'option BindingProvider (qui ne fonctionnait pas pour moi, d'ailleurs).

0
TastyWheat