Le problème est que je dois créer un client de service Web à partir d'un fichier qui m'a été fourni. J'ai stocké ce fichier sur le système de fichiers local et, tandis que je garde le fichier WSDL dans le bon dossier du système de fichiers, tout va bien. Lorsque je le déploie sur un serveur ou supprime le fichier WSDL du dossier du système de fichiers, le proxy ne trouve pas le fichier WSDL et génère une erreur. Je l'ai cherché sur le web et je l'ai trouvé les postes suivants mais je ne suis pas été en mesure de le faire fonctionner:
JAX-WS Loading WSDL from jar
http://www.java.net/forum/topic/glassfish/metro-and-jaxb/client-jar-cant-find-local-wsdl-0
http://blog.vinodsingh.com/2008/12/locally-packaged-wsdl.htmlClient JAX-WS: quel est le bon chemin pour accéder au WSDL local?
J'utilise NetBeans 6.1 (ce qui est un héritage application que je dois mettre à jour avec ce nouveau client de service Web). Ci-dessous la classe 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);
}
}
Ceci est mon code pour utiliser le 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 mettre une copie du WSDL dans web-inf/wsdl/client/SOAService, donc je ne veux pas l'ajouter à META-INF aussi. Les classes de service sont dans WEB-INF/classes/com/ibm/eci/soaservice/ et la variable baseurl contient le chemin complet du système de fichiers (c: \ chemin \ vers \ le \ projet ... \ soaservice). Le code ci-dessus soulève l'erreur:
javax.xml.ws.WebServiceException: Failed to access the WSDL at: file:/WEB-INF/wsdl/client/SOAService.wsdl. It failed with: \WEB-INF\wsdl\client\SOAService.wsdl (cannot find the path)
Alors, tout d'abord, puis-je mettre à jour le WSDLLocation de la classe proxy? Alors comment puis-je dire à la classe SOAService dans WEB-INF/classes/com/ibm/eci/soaservice de rechercher le WSDL dans \ WEB-INF \ wsdl \ client \ SOAService.wsdl?
EDITED: J'ai trouvé cet autre lien - http://jianmingli.com/wp/?cat=41, qui dit de mettre le WSDL dans le classpath. J'ai honte de demander: comment puis-je le mettre dans le classpath de l'application web?
Question similaire: [JAX-WS Chargement du fichier WSDL depuis le fichier jar] (http://stackoverflow.com/questions/764772/jax-ws-loading-wsdl-from-jar/15913322#15913322) – sleske