El problema es que necesito crear un cliente de servicio web a partir de un archivo que me han proporcionado. He almacenado este archivo en el sistema de archivos local y, aunque guardo el archivo WSDL en la carpeta del sistema de archivos correcta, todo está bien. Cuando lo implemento en un servidor o elimino el WSDL de la carpeta del sistema de archivos, el proxy no puede encontrar el WSDL y aparece un error. Busqué en la web y encontré las siguientes publicaciones todavía no he podido hacer que funcione:
JAX-WS Cargando WSDL desde jar
http://www.java.net/forum/topic/glassfish/metro -y-jaxb / client-jar-cant-find-local-wsdl-0
http://blog.vinodsingh.com/2008/12/locally-packaged-wsdl.html
Estoy usando NetBeans 6.1 (esta es una aplicación heredada que debo actualizar con este nuevo cliente de servicio web). A continuación se muestra la clase de proxy JAX-WS:
@WebServiceClient(name = "SOAService", targetNamespace = "http://soaservice.eci.ibm.com/", wsdlLocation = "file:/C:/local/path/to/wsdl/SOAService.wsdl")
public class SOAService
extends Service
{
private final static URL SOASERVICE_WSDL_LOCATION;
private final static Logger logger = Logger.getLogger(com.ibm.eci.soaservice.SOAService.class.getName());
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;
}
public SOAService(URL wsdlLocation, QName serviceName) {
super(wsdlLocation, serviceName);
}
public SOAService() {
super(SOASERVICE_WSDL_LOCATION, new QName("http://soaservice.eci.ibm.com/", "SOAService"));
}
/**
* @return
* returns SOAServiceSoap
*/
@WebEndpoint(name = "SOAServiceSOAP")
public SOAServiceSoap getSOAServiceSOAP() {
return super.getPort(new QName("http://soaservice.eci.ibm.com/", "SOAServiceSOAP"), SOAServiceSoap.class);
}
/**
* @param features
* A list of {@link javax.xml.ws.WebServiceFeature} to configure on the proxy. Supported features not in the <code>features</code> parameter will have their default values.
* @return
* returns SOAServiceSoap
*/
@WebEndpoint(name = "SOAServiceSOAP")
public SOAServiceSoap getSOAServiceSOAP(WebServiceFeature... features) {
return super.getPort(new QName("http://soaservice.eci.ibm.com/", "SOAServiceSOAP"), SOAServiceSoap.class, features);
}
}
Este es mi código para usar el proxy:
WebServiceClient annotation = SOAService.class.getAnnotation(WebServiceClient.class);
// trying to replicate proxy settings
URL baseUrl = com.ibm.eci.soaservice.SOAService.class.getResource("");//note : proxy uses "."
URL url = new URL(baseUrl, "/WEB-INF/wsdl/client/SOAService.wsdl");
//URL wsdlUrl = this.getClass().getResource("/META-INF/wsdl/SOAService.wsdl");
SOAService serviceObj = new SOAService(url, new QName(annotation.targetNamespace(), annotation.name()));
proxy = serviceObj.getSOAServiceSOAP();
/* baseUrl;
//classes\com\ibm\eci\soaservice
//URL url = new URL(baseUrl, "../../../../wsdl/SOAService.wsdl");
proxy = new SOAService().getSOAServiceSOAP();*/
//updating service endpoint
Map<String, Object> ctxt = ((BindingProvider)proxy ).getRequestContext();
ctxt.put(JAXWSProperties.HTTP_CLIENT_STREAMING_CHUNK_SIZE, 8192);
ctxt.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, WebServiceUrl);
NetBeans colocó una copia del WSDL en web-inf / wsdl / client / SOAService , así que no quiero agregarlo también a META-INF . Las clases de servicio están en WEB-INF / classes / com / ibm / eci / soaservice / y la variable baseurl contiene la ruta completa del sistema de archivos (c: \ path \ to \ the \ project ... \ soaservice). El código anterior genera el error:
javax.xml.ws.WebServiceException: no se pudo acceder al WSDL en: archivo: /WEB-INF/wsdl/client/SOAService.wsdl. Falló con: \ WEB-INF \ wsdl \ client \ SOAService.wsdl (no se puede encontrar la ruta)
Entonces, en primer lugar, ¿debo actualizar la ubicación wsd de la clase de proxy? Entonces, ¿cómo le digo a la clase SOAService en WEB-INF / classes / com / ibm / eci / soaservice que busque el WSDL en \ WEB-INF \ wsdl \ client \ SOAService.wsdl?
EDITADO : Encontré este otro enlace: http://jianmingli.com/wp/?cat=41 , que dice poner el WSDL en el classpath. Me avergüenza preguntar: ¿cómo lo coloco en la ruta de clases de la aplicación web?