2011-05-09 12 views
5

Tengo un servicio web que se creó hace varios años en C++ y lo consume un cliente .NET usando C# 's "wsdl.exe" para generar el cliente talones. Por una variedad de razones, ahora también necesito un cliente Java y estoy dispuesto a restringir el uso a Java 6 (JDK 1.6) con JAX-WS. Los stubs generados funcionan bien, incluso cuando están empaquetados en .jar, pero tengo un problema con la forma en que los clientes del servicio web JAX-WS desean implementarse. Parece que el problema que estoy teniendo es solucionable, pero ninguna de las formas sugeridas parece funcionar.Incrustar el WSDL para un servicio web en un cliente JAX-WS .jar

JAX-WS espera que el WSDL sea accesible, preferiblemente desde la red, ya que analiza el WSDL cada vez que se inicia para crear los enlaces. Al igual que jgrowl en Creating a web-service client with a known but inaccessible wsdl, es posible que el cliente no tenga acceso al WSDL en la URL que usa JAX-WS (que probablemente será un archivo en la máquina de compilación o un puntero a localhost). Deseo enviar el WSDL dentro del cliente .jar, pero la solución más simple (-wsdllocation "/path/to/wsdl/in/jar.wsdl") muestra una advertencia que no deseo mostrar.

También preferiría no haciendo que el cliente haga algo así como la solución que jgrowl encontró, que parece funcionar pero que no funciona. Los artículos encontrados en Google principalmente dirigen las ubicaciones WSDL del servidor, pero sugieren que los clientes deberían poder trabajar con los archivos META-INF/jax-ws-catalog.xml que traducen la URL usada en -wsdllocation a una ruta en el archivo .jar, pero parece que no funcionan en nuestras pruebas.

¿Hay una "receta" para que pueda poner el WSDL dentro de la jar en algún lugar y tener un cliente JAX-WS sólo el trabajo sin ningún esfuerzo adicional por parte del usuario del cliente y sin advertencias?

Respuesta

3

Si prefiere no configurar la URL para el WSDL en el constructor, es posible que pueda confiar en el comportamiento de los artefactos generados. Cuando I use la siguiente -wsdlLocation:

-wsdllocation wsdl/MaintainAddress.wsdl 

La siguiente se genera en el código de servicio como un inicializador estático:

static { 
    URL url = null; 
    try { 
     URL baseUrl; 
     baseUrl = demo.ws.service.MaintainAddress_Service.class.getResource("."); 
     url = new URL(baseUrl, "wsdl/MaintainAddress.wsdl"); 
    } catch (MalformedURLException e) { 
     logger.warning("Failed to create URL for the wsdl Location: 'wsdl/MaintainAddress.wsdl', retrying as a local file"); 
     logger.warning(e.getMessage()); 
    } 
    MAINTAINADDRESS_WSDL_LOCATION = url; 
} 

En esencia, esto va a hacer lo mismo que la solución que encontró, pero con el valor por defecto constructor. El WSDL debe ser un recurso en classpath en la carpeta wsdl.

Este enfoque no emite ninguna advertencia para mí.

No creo que este comportamiento esté definido en the spec - al menos, no he podido encontrarlo. Creo que es un detalle de implementación de la herramienta wsimport en mi JDK.


tiene más opciones si se está desplegando a un contenedor Java EE - ver JSR 109. Creo que aquí es donde entra en juego el jax-ws-catalog.xml.

+0

Desafortunadamente, hacer '-wsdlLocation wsdl/MaintainAddress.wsdl' da como resultado las advertencias, al menos cuando lo probé el viernes. Dicho esto, parece que las cosas 'jax-ws-catalog.xml' funcionan a partir de hoy. Color me desconcertó. –

+0

¿Puedes actualizar/responder a tu pregunta con la solución jax-ws-catalog.xml? Me imagino a mí mismo para encontrarme con el mismo problema en un futuro previsible ... ¡gracias! –

+0

@Austin Ziegler: podría ser útil que diga cuál es el mensaje de advertencia. – McDowell

Cuestiones relacionadas