Das Problem ist, dass ich einen Webdienst-Client aus einer Datei erstellen muss, die mir bereitgestellt wurde. Ich habe diese Datei im lokalen Dateisystem gespeichert und während ich die WSDL-Datei im richtigen Dateisystemordner behalte, ist alles in Ordnung. Wenn ich es auf einem Server bereitstelle oder die WSDL aus dem Dateisystemordner entferne, kann der Proxy die WSDL nicht finden und es tritt ein Fehler auf. Ich habe das Web durchsucht und die folgenden Beiträge gefunden, aber ich konnte es nicht zum Laufen bringen:
JAX-WS Laden von WSDL aus dem 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
Ich verwende NetBeans 6.1 (dies ist eine Legacy-Anwendung, die ich mit diesem neuen Webdienst-Client aktualisieren muss). Unten finden Sie die JAX-WS-Proxy-Klasse:
@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);
}
}
Dies ist mein Code zur Verwendung des Proxys:
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 hat eine Kopie der WSDL in web-inf / wsdl / client / SOAService abgelegt , daher möchte ich sie nicht auch zu META-INF hinzufügen . Serviceklassen sind in WEB-INF / classes / com / ibm / eci / soaservice / und die Variable baseurl enthält den vollständigen Pfad des Dateisystems (c: \ path \ to \ the \ project ... \ soaservice). Der obige Code löst den Fehler aus:
javax.xml.ws.WebServiceException: Zugriff auf die WSDL fehlgeschlagen unter: file: /WEB-INF/wsdl/client/SOAService.wsdl. Es ist fehlgeschlagen mit: \ WEB-INF \ wsdl \ client \ SOAService.wsdl (Pfad kann nicht gefunden werden)
Soll ich also zuerst die wsdllocation der Proxy-Klasse aktualisieren? Wie kann ich dann die SOAService-Klasse in WEB-INF / classes / com / ibm / eci / soaservice anweisen, in \ WEB-INF \ wsdl \ client \ SOAService.wsdl nach der WSDL zu suchen?
BEARBEITET : Ich habe diesen anderen Link gefunden - http://jianmingli.com/wp/?cat=41 , der besagt , dass die WSDL in den Klassenpfad eingefügt werden soll. Ich schäme mich zu fragen: Wie füge ich es in den Klassenpfad der Webanwendung ein?