2010-08-25 12 views
44

Usando el código que se generó con wsimport, ¿puede anularse el punto final del servicio sin tener que volver a generar el código?anulando o estableciendo el punto final del servicio web en tiempo de ejecución para el código generado con wsimport

He escrito un simple servicio web java, pasos son los siguientes:

  1. que compilar la clase Java y generar un archivo de la guerra
  2. desplegar el archivo WAR a mi servidor de aplicaciones (Tomcat)
  3. Acceda al WSDL a través de la URL, por ejemplo localhost: 8080/servicio/HelloService WSDL
  4. utilizar la dirección URL con wsimport.bat para generar clases de cliente, por ejemplo: wsimport http://localhost:8080/service/helloservice?Wsdl
  5. uso esas clases en mi aplicación cliente para llamar al servicio

El problema es que el servicio se implementa en un servidor de aplicaciones que se ejecuta en un puerto que no sea 8080, la comunicación entre el cliente y el servicio nunca ocurre. Estoy intentando saber cuál es la mejor manera de crear stubs que no tengan el servidor y el puerto codificados en el stub utilizado por el cliente.

+0

Pregunta relacionada: http://stackoverflow.com/questions/3567856/changing-the-url-on-a-webservice-client-generated-with-wsimport – McDowell

Respuesta

75

Su cliente puede establecer el punto final en el "puerto" de servicio en el tiempo de ejecución a través de la interfaz BindingProvider.

Considere el cliente JAX-WS en this JAX-WS tutorial. Otra manera de escribir el código sería:

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

Advertencia: No he descargado el código tutorial y probado este código en contra de ella.

+0

Gracias, eso es lo que estaba buscando. – user363808

+0

Estoy viendo esto. Aparentemente con el código generado con versiones recientes de JAX-WS wsimport, el WSDL debe estar accesible en la dirección especificada para wsimport en el momento en que se ejecuta 'new HelloService()' (mucho antes de que el proveedor de enlace tenga siquiera la oportunidad de iniciar sesión). ¿Es la única manera de arreglar esto, tener una copia local del WSDL que se puede analizar para que el constructor tenga éxito? –

+0

@ ThorbjørnRavnAndersen Si la memoria le sirve, puede establecer la ubicación de WSDL en todo lo que desee en el momento de la generación; consulte el argumento '-wsdllocation' para [wsimport] (http://download.oracle.com/javase/6/docs/technotes/tools/# webservices) herramienta. Pero generalmente lo proporcionaría explícitamente en un cliente no administrado - [ejemplo] (http://illegalargumentexception.blogspot.co.uk/2011/04/java-jax-ws-web-services-and-clients.html#ws_client) . – McDowell

-1

que se enfrenta el mismo problema, y ​​era terrible coz una vez que el código se trasladó a la producción que siempre buscó la ubicación WSDL codificado decir, Windows C: ........ etc

tengo Pasé por varias publicaciones y páginas para encontrar la respuesta; sin embargo, todo estaba fallando y me encontré a mí mismo de una manera al observar la clase de servicio generada por las importaciones de JAX-WS.

Tuve que anular la implementación de la ubicación JAX-WS WSDL en mi clase de llamadas de esta manera.

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

Cuestiones relacionadas