2009-03-16 9 views
2

J'ai un fichier WSDL pour un service Web. J'utilise JAX-WS/wsimport pour générer une interface client avec le service Web. Je ne sais pas à l'avance l'hôte sur lequel le service Web sera exécuté, et je peux presque garantir qu'il ne sera pas http://localhost:8080. Comment spécifier l'URL de l'hôte lors de l'exécution, par ex. à partir d'un argument de ligne de commande?Comment spécifier l'hôte et le port lors de l'accès à un service Web à partir d'un code généré par JAX-WS?

Le constructeur généré MyService(URL wsdlLocation, QName serviceName) ne ressemble pas à ce que je veux, mais peut-être que c'est? Peut-être l'une des variantes de Service.getPort(...)?

Merci!

Répondre

1

Le constructeur devrait fonctionner correctement pour vos besoins, lorsque vous créez MyService, transmettez-lui l'URL du WSDL que vous voulez, c'est-à-dire http://someurl:someport/service?wsdl.

+0

Ok. Juste pour que je comprenne ... MyService demandera le WSDL et puis utilisera tout ce qui est dans la balise pour déterminer où le service est réellement? –

+0

Je pense que c'est vrai, j'ai essayé de le chercher mais je ne trouve rien à répondre clairement. –

+0

Oui. JAX-WS chargera le WSDL à wsdlLocation, puis analysera le WSDL pour le service et le port spécifiés par serviceName et portName, respectivement. JAX-WS utilisera l'URL spécifiée dans le port WSDL lors de l'appel du service Web. Ainsi, vous devrez connaître l'URL WSDL, le nom de service QName et le nom de port QName afin d'interagir avec le service distant en utilisant le code indiqué ci-dessus. – DavidValeri

1

Si vous regardez dans la source générée à proximité du constructeur généré, vous devriez être en mesure de comprendre ce qu'on va y mettre du constructeur par défaut, devrait ressembler à:

public OrdersService() { 
    super(WSDL_LOCATION, new QName("http://namespace.org/order/v1", "OrdersService")); 
} 

Vous devriez être capable de trouver le def de WSDL_LOCATION dans le champ statique plus haut dans la classe.

1

Dans votre code généré (par exemple: "HelloWorldWebServiceImplService") regardez dans le bloc statique en haut qui fera référence au fichier WSDL url ou wsdl qui se trouve sous META-INF.

/* 
static { 
    URL url = null; 
    try { 
     url = new URL("http://loclahost/HelloWorld/HelloWorldWebServiceImpl?wsdl"); 
    } catch (MalformedURLException e) { 
     java.util.logging.Logger.getLogger(HelloWorldWebServiceImplService.class.getName()) 
      .log(java.util.logging.Level.INFO, 
       "Can not initialize the default wsdl from {0}", "http://loclahost/HelloWorld/HelloWorldWebServiceImpl?wsdl"); 
    } 
    WSDL_LOCATION = url; 
} 
*/ 

Une fois que vous commentiez cela, vous devez également commenter le construtor par défaut et inutile de dire intialize la WSDL_LOCATION statique = null; (à null) Ainsi, vous n'aurez pas deux constructeurs comme indiqué ci-dessous.

public final static URL WSDL_LOCATION = null; 
public HelloWorldWebServiceImplService(URL wsdlLocation) { 
    super(wsdlLocation, SERVICE); 
} 

public HelloWorldWebServiceImplService(URL wsdlLocation, QName serviceName) { 
    super(wsdlLocation, serviceName); 
} 

Appel Webservice: maintenant dans l'appel client où vous instancier cet objet, utilisez l'URL webservice comme argument comme indiqué

//You can read mywebserviceURL from property file as String. 
    String mywebserviceURL = "http://myqamachine.com/HelloWorld/HelloWorldWebServiceImpl?wsdl" 
    URL WsURL = new URL(mywebserviceURL); 
    HelloWorldWebServiceImplService webService = new HelloWorldWebServiceImplService(WsURL); 

Alors là, vous pouvez pointer l'URL webservice dynamiquement.