¿Cómo cambiar el extremo de la URL del servicio web?


101

Genere un cliente de servicio web usando las utilidades de JBoss (compatible con JAX-WS) usando el 'cliente de servicio web de Eclipse desde un wsdl'.

Entonces, lo único que proporcioné fue una URL a un WSDL de servicio web.

Ahora, el proveedor de servicios web me dice que cambie la "URL del acceso a la aplicación de punto final del cliente" del servicio web.

¿Qué es y cómo cambiarlo?


¿Puedes recrear la cosa usando el mismo asistente de Eclipse con la nueva URL?
Thilo

Dígale al proveedor de servicios web que necesita la nueva URL para wsdl, luego úsela con el asistente de Eclipse para regenerar el cliente.
systemmpuntoout

@Thilo @systemputoout CHICOS, ¡el problema es que tienen LA MISMA URL WSDL! No estoy seguro, pero me parece que en Axis puede proporcionar una URL al invocar el servicio web. En JAX-WS no puede cambiar el "punto final del cliente durante el tiempo de ejecución". ¿Alguna idea, chicos?
EugeneP

1
@ Pascal Thivent, @systempuntoout Cite: "URL o punto final para el acceso a la aplicación cliente"
EugeneP

1
Bueno, mi comprensión de esta oración es "los clientes acceden a un punto final de servicio; la ubicación del punto final ha cambiado". Y esto tiene sentido.
Pascal Thivent

Respuestas:


174

En mi opinión, el proveedor le está diciendo que cambie el punto final del servicio (es decir, dónde llegar al servicio web), no el punto final del cliente (no entiendo qué podría ser). Para cambiar el punto final del servicio, básicamente tiene dos opciones.

Utilice el proveedor de enlace para establecer la URL del extremo

La primera opción es cambiar el BindingProvider.ENDPOINT_ADDRESS_PROPERTYvalor de la propiedad de BindingProvider(cada proxy implementa la javax.xml.ws.BindingProviderinterfaz):

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

El inconveniente es que esto solo funciona cuando todavía se puede acceder al WSDL original. No recomendado.

Use el WSDL para obtener la URL del punto final

La segunda opción es obtener la URL del punto final del 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]));
...

7
Creo que hay un error en el segundo bloque de código, ¿no debería ser URL newEndpoint = new URL ("WSDL_URL"); en la primera linea ??
Jaime Hablutzel

3
aquí hay un enlace a un tutorial tugdualgrall.blogspot.com/2009/02/…
shareef

12
Vale la pena señalar que las wsimportherramientas modernas ya no generan código con un get[Service]Portmétodo. En su lugar, llame get[Service]y convierta el objeto resultante en a BindingProviderpara establecer este tipo de propiedades.
Christopher Schultz

¡Gracias @ChristopherSchultz por el consejo de wsimport! Eso def. trabajó para nosotros
Cuga

1
Por lo que tengo entendido del código auxiliar generado por cxf, la segunda opción anterior cambia la URL wsdl, no la URL del servicio. ¿Me estoy perdiendo de algo?
concierto

16

Para agregar una aclaración aquí, cuando crea su servicio, la clase de servicio usa la 'wsdlLocation' predeterminada, que se insertó en ella cuando la clase se compiló a partir de wsdl. Entonces, si tiene una clase de servicio llamada SomeService y crea una instancia como esta:

SomeService someService = new SomeService();

Si miras dentro de SomeService, verás que el constructor se ve así:

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

Entonces, si desea que apunte a otra URL, simplemente use el constructor que toma un argumento de URL (hay 6 constructores para configurar qname y características también). Por ejemplo, si ha configurado un monitor TCP / IP local que está escuchando en el puerto 9999 y desea redirigir a esa URL:

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

y que llamará a este constructor dentro del servicio:

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

2
No necesariamente. Tengo servicios generados con wsdl2java de Apache CXF, e incluso cuando pasamos la nueva ubicación de wsdl al constructor, sus puertos aún intentan vincularse a la ubicación establecida en el momento de la compilación / generación (sin dejar otra opción que encasillar el puerto a BindingProvider y establecer la nueva dirección en su mapa de contexto de solicitud.)
luis.espinal

1
@Luis: es difícil saber exactamente lo que está viendo, pero si depura, debería ver la llamada en la clase de proveedor javax, y luego verla, intente crear el punto final con su nueva ubicación wsdl (asumiendo que está usando JAX-WS 2.0 +). Luego, dentro de su servicio, la llamada getPort debería llamar a super.getPort, que usa tiene su nuevo puerto configurado en un objeto serviceDelegate. Así es como debería funcionar con javax.xml.ws.Service en JAX-WS 2.0. Pondría un punto de interrupción en la súper llamada e investigaría desde allí.
MattC

0

No iría tan lejos como @Femi para cambiar la propiedad de dirección existente. Puede agregar nuevos servicios a la sección de definiciones fácilmente.

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

Esto no requiere una recompilación del WSDL en Java y realizar actualizaciones no es más difícil que si usara la opción BindingProvider (que no funcionó para mí por cierto).


-6

Para cambiar la propiedad de la dirección final, edite su archivo 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>

11
En muchos casos, el WSDL se le impone y no se supone que deba cambiarlo. Más importante aún, de un entorno a otro (prueba vs en vivo), es probable que la URL del punto final cambie ... y nadie quiere modificar el wsdl y volver a compilar en este caso.
Myobis
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.