web-dev-qa-db-fra.com

remplacement ou configuration du point de terminaison du service Web au moment de l'exécution pour le code généré avec wsimport

À l'aide du code généré avec wsimport, le point de terminaison du service peut-il être remplacé sans qu'il soit nécessaire de régénérer le code?

J'ai écrit un simple service Web Java, en suivant les étapes:

  1. Je compile la classe Java et génère un fichier war
  2. Déployer le fichier war sur mon serveur d'applications (Tomcat)
  3. Accédez au WSDL via l’URL, par exemple. localhost: 8080/service/helloservice? wsdl
  4. utilisez l'URL avec wsimport.bat pour générer des classes clientes, par exemple: wsimport http://localhost:8080/service/helloservice?Wsdl
  5. J'utilise ces classes dans mon application client pour appeler le service

Le problème est que si le service est déployé sur un serveur d'applications fonctionnant sur un port autre que 8080, la communication entre le client et le service ne se produit jamais. J'essaie de savoir quel est le meilleur moyen de créer des stubs sans serveur ni port codés en dur dans le stub utilisé par le client.

51
user363808

Votre client peut définir le point final du "port" du service au moment de l'exécution via l'interface BindingProvider .

Considérez le client JAX-WS dans ce didacticiel JAX-WS . Une autre façon d'écrire ce code serait:

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

Avertissement: je n'ai pas téléchargé le code du tutoriel et testé ce code par rapport à celui-ci.

82
McDowell

J’étais confronté au même problème et c’était terrible parce que, une fois le code mis en production, il recherchait toujours l’emplacement WSDL codé en dur, c’est-à-dire Windows C: ........ etc.

J'ai parcouru divers articles et pages pour trouver la réponse, mais tout a échoué, puis j'ai trouvé un moyen de regarder la classe de service générée par les importations JAX-WS.

J'ai dû remplacer l'implémentation d'emplacement WSDL JAX-WS dans ma classe d'appel comme ceci.

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

0
user3749126