Vấn đề là tôi cần tạo một ứng dụng khách dịch vụ web từ một tệp mà tôi đã được cung cấp. Tôi đã lưu trữ tệp này trên hệ thống tệp cục bộ và trong khi tôi giữ tệp WSDL trong đúng thư mục hệ thống tệp, mọi thứ đều ổn. Khi tôi triển khai nó đến một máy chủ hoặc xóa WSDL khỏi thư mục hệ thống tệp, proxy không thể tìm thấy WSDL và xảy ra lỗi. Tôi đã tìm kiếm trên web và tìm thấy các bài đăng sau đây nhưng tôi không thể làm cho nó hoạt động:
JAX-WS Đang tải WSDL từ 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
Tôi đang sử dụng NetBeans 6.1 (đây là ứng dụng cũ mà tôi đã cập nhật với ứng dụng khách dịch vụ web mới này). Dưới đây là lớp 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);
}
}
Đây là mã của tôi để sử dụng 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 đã đưa một bản sao của WSDL vào web-inf / wsdl / client / SOAService , vì vậy tôi cũng không muốn thêm nó vào META-INF . Các lớp dịch vụ nằm trong WEB-INF / class / com / ibm / eci / soaservice / và biến baseurl chứa đường dẫn đầy đủ của hệ thống tệp đến nó (c: \ path \ to \ the \ project ... \ soaservice). Đoạn mã trên gây ra lỗi:
javax.xml.ws.WebServiceException: Không thể truy cập WSDL tại: tệp: /WEB-INF/wsdl/client/SOAService.wsdl. Nó không thành công với: \ WEB-INF \ wsdl \ client \ SOAService.wsdl (không thể tìm thấy đường dẫn)
Vì vậy, trước hết, tôi có nên cập nhật wsdllocation của lớp proxy không? Sau đó, làm cách nào để yêu cầu lớp SOAService trong WEB-INF / class / com / ibm / eci / soaservice tìm kiếm WSDL trong \ WEB-INF \ wsdl \ client \ SOAService.wsdl?
ĐÃ CHỈNH SỬA : Tôi đã tìm thấy liên kết khác này - http://jianmingli.com/wp/?cat=41 , có nghĩa là đưa WSDL vào classpath. Tôi xấu hổ khi hỏi: làm cách nào để đưa nó vào đường dẫn ứng dụng web?