Sorun şu ki, bana verilen bir dosyadan bir web hizmeti istemcisi oluşturmam gerekiyor. Bu dosyayı yerel dosya sisteminde sakladım ve WSDL dosyasını doğru dosya sistemi klasöründe tutarken her şey yolunda. Bir sunucuya dağıttığımda veya WSDL'yi dosya sistemi klasöründen kaldırdığımda proxy WSDL'yi bulamıyor ve bir hata veriyor. Web'de arama yaptım ve aşağıdaki gönderileri buldum, henüz çalışmasını sağlayamadım:
JAX-WS WSDL'yi jar
http://www.java.net/forum/topic/glassfish/metro'dan yükleme -and-jaxb / client-jar-cant-find-local-wsdl-0
http://blog.vinodsingh.com/2008/12/locally-packaged-wsdl.html
NetBeans 6.1 kullanıyorum (bu, bu yeni web hizmeti istemcisiyle güncellemem gereken eski bir uygulamadır). JAX-WS proxy sınıfı aşağıdadır:
@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);
}
}
Proxy kullanmak için benim kodum:
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, WSDL'nin bir kopyasını web-inf / wsdl / client / SOAService içine koydu , bu yüzden META- INF'e de eklemek istemiyorum . Hizmet sınıfları WEB-INF / classes / com / ibm / eci / soaservice / içindedir ve baseurl değişkeni, dosya sisteminin tam yolunu içerir (c: \ yol \ - \ proje ... \ soaservice). Yukarıdaki kod hatayı ortaya çıkarır:
javax.xml.ws.WebServiceException: WSDL'ye şu adresten erişilemedi: dosya: /WEB-INF/wsdl/client/SOAService.wsdl. Şununla başarısız oldu: \ WEB-INF \ wsdl \ client \ SOAService.wsdl (yolu bulamıyor)
Öyleyse, öncelikle proxy sınıfının wsdllocation'unu güncellemeli miyim? O halde WEB-INF / classes / com / ibm / eci / soaservice'deki SOAService sınıfına \ WEB-INF \ wsdl \ client \ SOAService.wsdl'de WSDL'yi aramasını nasıl söyleyebilirim?
DÜZENLENMİŞ : Bu diğer bağlantıyı buldum - http://jianmingli.com/wp/?cat=41 , WSDL'yi sınıf yoluna koymayı söylüyor. Sormaya utanıyorum: bunu web uygulaması sınıf yoluna nasıl koyarım?