Masalahnya adalah saya perlu membangun klien layanan web dari file yang telah saya sediakan. Saya telah menyimpan file ini di sistem file lokal dan, sementara saya menyimpan file WSDL di folder sistem file yang benar, semuanya baik-baik saja. Ketika saya menyebarkannya ke server atau menghapus WSDL dari folder sistem file, proxy tidak dapat menemukan WSDL dan memunculkan kesalahan. Saya telah mencari di web dan saya menemukan posting berikut ini, namun saya tidak dapat membuatnya berfungsi:
JAX-WS Memuat WSDL dari 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
Saya menggunakan NetBeans 6.1 (ini adalah aplikasi warisan yang telah saya perbarui dengan klien layanan web baru ini). Di bawah ini adalah kelas 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);
}
}
Ini kode saya untuk menggunakan 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 meletakkan salinan WSDL di web-inf / wsdl / client / SOAService , jadi saya tidak ingin menambahkannya ke META-INF juga. Kelas layanan berada di WEB-INF / class / com / ibm / eci / soaservice / dan variabel baseurl berisi jalur lengkap sistem file ke sana (c: \ path \ to \ the \ project ... \ soaservice). Kode di atas menimbulkan kesalahan:
javax.xml.ws.WebServiceException: Gagal mengakses WSDL di: file: /WEB-INF/wsdl/client/SOAService.wsdl. Itu gagal dengan: \ WEB-INF \ wsdl \ client \ SOAService.wsdl (tidak dapat menemukan jalur)
Jadi, pertama-tama, haruskah saya memperbarui lokasi wsd dari kelas proxy? Lalu bagaimana cara mengetahui class SOAService di WEB-INF / class / com / ibm / eci / soaservice untuk mencari WSDL di \ WEB-INF \ wsdl \ client \ SOAService.wsdl?
DIEDIT : Saya telah menemukan tautan lain ini - http://jianmingli.com/wp/?cat=41 , yang mengatakan untuk meletakkan WSDL ke jalur kelas. Saya malu bertanya: bagaimana cara memasukkannya ke classpath aplikasi web?