问题是我需要从提供给我的文件中构建一个 Web 服务客户端。我已经将这个文件存储在本地文件系统中,虽然我将 WSDL 文件保存在正确的文件系统文件夹中,但一切正常。当我将它部署到服务器或从文件系统文件夹中删除 WSDL 时,代理无法找到 WSDL 并出现错误。我在网上搜索了一下,发现了下面这些帖子,但是我还是不能让它们生效:
从 jar 加载 WSDL
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
我正在使用 NetBeans 6.1(这是一个遗留的应用程序,我必须用这个新的 Web 服务客户端来更新它)。下面是 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);
}
}
这是我使用代理的代码:
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 的一个副本放在 Web-inf/wsdl/client/SOA 服务中,所以我不想把它也添加到 META-INF中。服务类位于 WEB-INF/classes/com/ibm/eci/soaserservice/中,baseurl 变量包含到它的文件系统完整路径(c: project... soaserservice 的路径)。上面的代码引发了错误:
WebServiceException: 无法访问位于: file:/WEB-INF/WSDL/client/SOAService.WSDL 的 WSDL: WEB-INF wsdl 客户端 SOAService.wsdl (找不到路径)
那么,首先,我应该更新代理类的 wsdllocation 吗?那么如何告诉 WEB-INF/classes/com/ibm/eci/soasservice 中的 SOAService 类在 WEB-INF WSDL 客户机 SOAService. WSDL 中搜索 WSDL 呢?
编辑 : 我发现了另一个链接 -http://jianmingli.com/wp/?cat=41,它表示将 WSDL 放入类路径。我很惭愧地问: 我该如何把它放到 Web 应用程序的类路径中?