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

101

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

Donc, la seule chose que j'ai fournie était une URL vers un WSDL de service Web.

Maintenant, le fournisseur de services Web me dit de changer l '"URL d'accès à l'application du point de terminaison client" du service Web.

Qu'est-ce que c'est et comment le changer?

EugèneP
la source
Pouvez-vous simplement recréer l'objet en utilisant le même assistant Eclipse avec la nouvelle URL?
Thilo
Dites au fournisseur de services Web que vous avez besoin de la nouvelle URL pour wsdl, puis utilisez-la avec l'assistant Eclipse pour régénérer le client.
systempuntoout
@Thilo @systemputoout GUYS, le problème est qu'ils ont LA MÊME URL WSDL !! Je ne suis pas sûr, mais il me semble que dans Axis, vous pouvez fournir une URL lors de l'appel du service Web. Dans JAX-WS, vous ne pouvez pas modifier le «point de terminaison client pendant l'exécution». Des idées, les gars?
EugeneP
1
@ Pascal Thivent, @systempuntoout Citer: "URL ou point de terminaison pour l'accès aux applications clientes"
EugeneP
1
Eh bien, ma compréhension de cette phrase est "les clients accèdent à un point de terminaison de service; l'emplacement du point de terminaison a changé". Et cela a du sens.
Pascal Thivent

Réponses:

174

OMI, le fournisseur vous dit de changer le point de terminaison du service (c'est-à-dire où atteindre le service Web), pas le point de terminaison client (je ne comprends pas ce que cela pourrait être). Pour modifier le point de terminaison du service, vous avez essentiellement deux options.

Utilisez le fournisseur de liaison pour définir l'URL du point de terminaison

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

...
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 point de terminaison

La deuxième option consiste à obtenir l'URL du point de terminaison à 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]));
...
Pascal Thivent
la source
7
Je pense qu'il y a une erreur dans le deuxième bloc de code, ne devrait-il pas être URL newEndpoint = new URL ("WSDL_URL"); dans la première ligne ??
Jaime Hablutzel
3
voici un lien vers un tutoriel tugdualgrall.blogspot.com/2009/02/…
shareef
12
Il convient de souligner que les wsimportoutils modernes ne génèrent plus de code avec une get[Service]Portméthode. Au lieu de cela, appelez get[Service]et transtypez l'objet résultant en a BindingProviderpour définir ces types de propriétés.
Christopher Schultz
Merci @ChristopherSchultz pour le conseil wsimport! Ce def. travaillé pour nous
Cuga
1
D'après ce que je comprends du code de stub généré par cxf, la deuxième option ci-dessus modifie l'url wsdl, pas l'url du service. Est-ce que je manque quelque chose?
cacert
16

Pour ajouter des précisions ici, lorsque vous créez votre service, la classe de service utilise la valeur par défaut «wsdlLocation», qui y a été insérée lorsque la classe a été construite à partir du 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 à l'intérieur de 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, vous utilisez simplement le constructeur qui prend un argument URL (il y a 6 constructeurs pour définir qname et des 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 = new URL("http://theServerName:9999/somePath");
SomeService someService = new SomeService(newWsdlLocation);

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

public SomeService(URL wsdlLocation) {
    super(wsdlLocation, SOMESERVICE_QNAME);
}
MattC
la source
2
Pas nécessairement. J'ai des services générés avec wsdl2java d'Apache CXF, et même lorsque nous transmettons le nouvel emplacement wsdl au constructeur, ses ports tentent toujours de se lier à l'emplacement défini au moment de la compilation / génération (ne laissant pas d'autre choix que de transtyper le port à BindingProvider et définir la nouvelle adresse dans sa carte de contexte de demande.)
luis.espinal
1
@Luis - Difficile de savoir exactement ce que vous voyez, mais si vous déboguez, vous devriez voir l'appel dans la classe javax Provider, puis le voir essayer de créer le point de terminaison avec votre nouvel emplacement wsdl (en supposant que vous utilisez JAX-WS 2.0 +). Ensuite, dans votre service, l'appel getPort doit appeler super.getPort, qui utilise votre nouveau port défini dans un objet serviceDelegate. C'est ainsi que cela devrait fonctionner avec javax.xml.ws.Service dans JAX-WS 2.0. Je mettrais un point d'arrêt sur le super appel et enquêterais à partir de là.
MattC
0

Je n'irais pas jusqu'à @Femi pour modifier 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 vers Java et la mise à jour n'est pas plus difficile que si vous utilisiez l'option BindingProvider (qui ne fonctionnait pas pour moi btw).

Savoureux Blé
la source
-6

Pour modifier la propriété d'adresse de fin, modifiez votre fichier 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>
Femi
la source
11
Dans de nombreux cas, le WSDL vous est imposé et vous n'êtes pas censé le changer. Plus important encore, d'un environnement à un autre (test vs live), l'URL du point final est susceptible de changer .. et personne ne veut modifier le wsdl et recompiler dans ce cas.
Myobis