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
- Haga su referencia de ubicación local wsdl como
wsdlLocation= "http://localhost/wsdl/yourwsdlname.wsdl"
- Cree una carpeta META-INF justo debajo de src. Coloque sus archivos wsdl en una carpeta bajo META-INF, diga META-INF / wsdl
-
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.