Saltar al contenido

Cliente JAX-WS: ¿cuál es la ruta correcta para acceder al WSDL local?

Te sugerimos que pruebes esta respuesta en un entorno controlado antes de pasarlo a producción, saludos.

Solución:

La mejor opción es usar jax-ws-catalog.xml

Cuando compile el archivo WSDL local, anule la ubicación WSDL y configúrelo en algo como

http://localhost/wsdl/SOAService.wsdl

No se preocupe, esto es solo un URI y no una URL, lo que significa que no tiene que tener el WSDL disponible en esa dirección.
Puede hacer esto pasando la opción wsdllocation al compilador wsdl to java.

Si lo hace, cambiará su código proxy de

static 
    URL url = null;
    try 
        URL baseUrl;
        baseUrl = com.ibm.eci.soaservice.SOAService.class.getResource(".");
        url = new URL(baseUrl, "file:/C:/local/path/to/wsdl/SOAService.wsdl");
     catch (MalformedURLException e) 
        logger.warning("Failed to create URL for the wsdl Location: 'file:/C:/local/path/to/wsdl/SOAService.wsdl', retrying as a local file");
        logger.warning(e.getMessage());
    
    SOASERVICE_WSDL_LOCATION = url;

para

static 
    URL url = null;
    try 
        URL baseUrl;
        baseUrl = com.ibm.eci.soaservice.SOAService.class.getResource(".");
        url = new URL(baseUrl, "http://localhost/wsdl/SOAService.wsdl");
     catch (MalformedURLException e) 
        logger.warning("Failed to create URL for the wsdl Location: 'http://localhost/wsdl/SOAService.wsdl', retrying as a local file");
        logger.warning(e.getMessage());
    
    SOASERVICE_WSDL_LOCATION = url;

Archivo de aviso: // cambiado a http: // en el constructor de URL.

Ahora viene en jax-ws-catalog.xml. Sin jax-ws-catalog.xml, jax-ws intentará cargar el WSDL desde la ubicación

http://localhost/wsdl/SOAService.wsdl

y fallar, ya que tal WSDL no estará disponible.

Pero con jax-ws-catalog.xml puede redirigir jax-ws a un WSDL empaquetado localmente siempre que intente acceder al WSDL @

http://localhost/wsdl/SOAService.wsdl

.

Aquí está jax-ws-catalog.xml


        
    

Lo que está haciendo es decirle a jax-ws que siempre que necesite cargar WSDL desde

http://localhost/wsdl/SOAService.wsdl

, debería cargarlo desde la ruta local wsdl / SOAService.wsdl.

Ahora, ¿dónde debería poner wsdl / SOAService.wsdl y jax-ws-catalog.xml? Esa es la pregunta del millón de dólares, ¿no?
Debe estar en el directorio META-INF de su aplicación jar.

entonces algo como esto

ABCD.jar  
|__ META-INF    
    |__ jax-ws-catalog.xml  
    |__ wsdl  
        |__ SOAService.wsdl  

De esta manera, ni siquiera tiene que anular la URL en su cliente que accede al proxy. El WSDL se obtiene de su JAR y evita tener que tener rutas de sistema de archivos codificadas en su código.

Más información en jax-ws-catalog.xml http://jax-ws.java.net/nonav/2.1.2m1/docs/catalog-support.html

Espero que ayude

Otro enfoque que hemos adoptado con éxito es generar el código de proxy del cliente WS usando wsimport (de Ant, como una tarea Ant) y especificar wsdlLocation attribute.



Dado que ejecutamos esto para un proyecto con múltiples WSDL, el script resuelve el valor $ (wsdl.file} dinámicamente que está configurado para ser /META-INF/wsdl/YourWebServiceName.wsdl relativo a la ubicación de JavaSource (o / src, dependiendo de cómo haya configurado su proyecto). Durante el proceso de compilación, los archivos WSDL y XSDs se copian en esta ubicación y se empaquetan en el archivo JAR (similar a la solución descrita por Bhasakar anteriormente)

MyApp.jar
|__META-INF
   |__wsdl
      |__YourWebServiceName.wsdl
      |__YourWebServiceName_schema1.xsd
      |__YourWebServiceName_schmea2.xsd

Nota: asegúrese de que los archivos WSDL utilicen referencias relativas a los XSD importados y no a las URL http:

  
    
      
    
    
      
    
  

En el generado código, encontramos esto:

/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.2-b05-
 * Generated source version: 2.1
 * 
 */
@WebServiceClient(name = "YourService", targetNamespace = "http://test.webservice.services.xyz.com/", wsdlLocation = "/META-INF/wsdl/YourService.wsdl")
public class YourService_Service
    extends Service


    private final static URL YOURWEBSERVICE_WSDL_LOCATION;
    private final static WebServiceException YOURWEBSERVICE_EXCEPTION;
    private final static QName YOURWEBSERVICE_QNAME = new QName("http://test.webservice.services.xyz.com/", "YourService");

    static 
        YOURWEBSERVICE_WSDL_LOCATION = com.xyz.services.webservice.test.YourService_Service.class.getResource("/META-INF/wsdl/YourService.wsdl");
        WebServiceException e = null;
        if (YOURWEBSERVICE_WSDL_LOCATION == null) 
            e = new WebServiceException("Cannot find '/META-INF/wsdl/YourService.wsdl' wsdl. Place the resource correctly in the classpath.");
        
        YOURWEBSERVICE_EXCEPTION = e;
    

    public YourService_Service() 
        super(__getWsdlLocation(), YOURWEBSERVICE_QNAME);
    

    public YourService_Service(URL wsdlLocation, QName serviceName) 
        super(wsdlLocation, serviceName);
    

    /**
     * 
     * @return
     *     returns YourService
     */
    @WebEndpoint(name = "YourServicePort")
    public YourService getYourServicePort() 
        return super.getPort(new QName("http://test.webservice.services.xyz.com/", "YourServicePort"), YourService.class);
    

    /**
     * 
     * @param features
     *     A list of @link javax.xml.ws.WebServiceFeature to configure on the proxy.  Supported features not in the features parameter will have their default values.
     * @return
     *     returns YourService
     */
    @WebEndpoint(name = "YourServicePort")
    public YourService getYourServicePort(WebServiceFeature... features) 
        return super.getPort(new QName("http://test.webservice.services.xyz.com/", "YourServicePort"), YourService.class, features);
    

    private static URL __getWsdlLocation() 
        if (YOURWEBSERVICE_EXCEPTION!= null) 
            throw YOURWEBSERVICE_EXCEPTION;
        
        return YOURWEBSERVICE_WSDL_LOCATION;
    


Quizás esto también pueda ayudar. Es simplemente un enfoque diferente que no utiliza el enfoque de “catálogo”.

Muchas gracias por la respuesta de Bhaskar Karambelkar, que explica en detalle y solucionó mi problema. Pero también me gustaría reformular la respuesta en tres sencillos pasos para alguien que tiene prisa por arreglar

  1. Haga su referencia de ubicación local wsdl como wsdlLocation= "http://localhost/wsdl/yourwsdlname.wsdl"
  2. Cree una carpeta META-INF justo debajo de src. Coloque sus archivos wsdl en una carpeta bajo META-INF, diga META-INF / wsdl
  3. Cree un archivo xml jax-ws-catalog.xml en META-INF como se muestra a continuación



Ahora empaqueta tu frasco. No más referencias al directorio local, todo está empaquetado y referenciado dentro

Comentarios y valoraciones

Recuerda mostrar este escrito si lograste el éxito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *