Il problema è che devo creare un client di servizi Web da un file che mi è stato fornito. Ho memorizzato questo file sul file system locale e, mentre tengo il file WSDL nella cartella del file system corretta, va tutto bene. Quando lo distribuisco su un server o rimuovo il WSDL dalla cartella del file system, il proxy non riesce a trovare il WSDL e genera un errore. Ho cercato sul web e ho trovato i seguenti post ma non sono riuscito a farlo funzionare:
JAX-WS Caricamento WSDL da jar
http://www.java.net/forum/topic/glassfish/metro -e-jaxb / client-jar-cant-find-local-wsdl-0
http://blog.vinodsingh.com/2008/12/locally-packaged-wsdl.html
Sto usando NetBeans 6.1 (questa è un'applicazione legacy che devo aggiornare con questo nuovo client di servizi web). Di seguito è riportata 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);
}
}
Questo è il mio codice per utilizzare il 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 ha messo una copia del WSDL in web-inf / wsdl / client / SOAService , quindi non voglio aggiungerlo anche a META-INF . Le classi di servizio si trovano in WEB-INF / classes / com / ibm / eci / soaservice / e la variabile baseurl contiene il percorso completo del file system (c: \ path \ to \ the \ project ... \ soaservice). Il codice precedente genera l'errore:
javax.xml.ws.WebServiceException: impossibile accedere a WSDL in: file: /WEB-INF/wsdl/client/SOAService.wsdl. Non è riuscito con: \ WEB-INF \ wsdl \ client \ SOAService.wsdl (impossibile trovare il percorso)
Quindi, prima di tutto, devo aggiornare la wsdllocation della classe proxy? Allora come faccio a dire alla classe SOAService in WEB-INF / classes / com / ibm / eci / soaservice di cercare WSDL in \ WEB-INF \ wsdl \ client \ SOAService.wsdl?
MODIFICATO : ho trovato questo altro collegamento - http://jianmingli.com/wp/?cat=41 , che dice di mettere il WSDL nel classpath. Mi vergogno a chiedere: come lo inserisco nel classpath dell'applicazione web?