Je suppose que c'est une question banale, mais après avoir passé beaucoup de temps à essayer tous les chemins, j'ai renoncé.
Le problème est que j'ai besoin de construire un client de service web à partir d'un fichier je suis été fournis. J'ai enregistré le fichier sur le système de fichiers local et, bien que je garde le fichier WSDL dans le bon dossier du système de fichiers, tout va bien. Quand je le déployer sur un serveur ou supprimer le fichier WSDL à partir du dossier système de fichiers le proxy ne peut pas trouver le fichier WSDL, et se lève une erreur. J'ai cherché sur le web et j'ai trouvé les postes suivants pourtant je ne suis pas été capable de le faire fonctionner:
JAX-WS Chargement WSDL à partir de 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.html
Je suis à l'aide de NetBeans 6.1 (c'est un héritage de l'application que j'ai mise à jour avec ce nouveau client de service web). Ci-dessous est le JAX-WS classe de proxy :
@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);
}
}
C'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 placer une copie du fichier WSDL dans web-inf/wsdl/client/SOAService, donc je ne veux pas à l'ajouter à META-INF . Les classes de Service sont dans WEB-INF/classes/com/ibm/ice/soaservice/ et baseurl variable contient le système de fichiers chemin d'accès complet (c:\path\to\the\project...\soaservice ). Le code ci-dessus génère 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, doit-je mettre à jour le wsdllocation de la classe de proxy? Alors comment dois-je dire à la SOAService classe dans WEB-INF/classes/com/ibm/ice/soaservice à la recherche pour le WSDL dans \WEB-INF\wsdl\client\SOAService.wsdl?
Je vous remercie à l'avance.
ÉDITÉ: j'ai trouvé cet autre lien - http://jianmingli.com/wp/?cat=41qui dire de mettre le WSDL dans le classpath. J'ai honte de poser la question: comment dois-je les mettre dans le classpath de l'application web?