ปัญหาคือฉันต้องสร้างไคลเอนต์บริการเว็บจากไฟล์ที่ได้รับมา ฉันเก็บไฟล์นี้ไว้ในระบบไฟล์ในเครื่องและในขณะที่ฉันเก็บไฟล์ WSDL ไว้ในโฟลเดอร์ระบบไฟล์ที่ถูกต้องทุกอย่างก็เรียบร้อยดี เมื่อฉันปรับใช้กับเซิร์ฟเวอร์หรือลบ WSDL ออกจากโฟลเดอร์ระบบไฟล์พร็อกซีไม่พบ WSDL และทำให้เกิดข้อผิดพลาด ฉันค้นหาเว็บและฉันพบโพสต์ต่อไปนี้ แต่ฉันไม่สามารถใช้งานได้:
JAX-WS กำลังโหลด WSDL จาก 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
ฉันใช้ NetBeans 6.1 (นี่เป็นแอปพลิเคชันดั้งเดิมที่ฉันอัปเดตด้วยไคลเอนต์บริการเว็บใหม่นี้) ด้านล่างนี้คือคลาสพร็อกซี 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 / SOAServiceดังนั้นฉันไม่ต้องการเพิ่มลงในMETA-INFด้วย คลาสเซอร์วิสอยู่ในWEB-INF / คลาส / com / ibm / eci / soaservice /และตัวแปร baseurl มีพา ธ แบบเต็มของระบบไฟล์ไปยังมัน (c: \ path \ to \ the \ project ... \ soaservice) รหัสด้านบนทำให้เกิดข้อผิดพลาด:
javax.xml.ws.WebServiceException: ไม่สามารถเข้าถึง WSDL ที่: file: /WEB-INF/wsdl/client/SOAService.wsdl ล้มเหลวด้วย: \ WEB-INF \ wsdl \ client \ SOAService.wsdl (ไม่พบเส้นทาง)
ก่อนอื่นฉันจะอัปเดต wsdllocation ของคลาสพร็อกซีหรือไม่ แล้วฉันจะบอกคลาส SOAService ใน WEB-INF / คลาส / com / ibm / eci / soaservice เพื่อค้นหา WSDL ใน \ WEB-INF \ wsdl \ client \ SOAService.wsdl ได้อย่างไร
แก้ไข : ฉันพบลิงค์อื่น - http://jianmingli.com/wp/?cat=41ซึ่งบอกว่าให้ใส่ WSDL ลงใน classpath ฉันละอายที่จะถาม: ฉันจะใส่ลงในคลาสพา ธ ของเว็บแอปพลิเคชันได้อย่างไร