เมื่อฉันสร้างลูกค้าเว็บเซอร์โดยใช้ wsdl2java จาก CXF (ซึ่งสร้างบางอย่างที่คล้ายกับ wsimport) ผ่าน maven บริการของฉันเริ่มต้นด้วยรหัสเช่นนี้:
@WebServiceClient(name = "StatusManagement",
wsdlLocation = "c:/some_absolute_path_to_a_wsdl_file.wsdl",
targetNamespace = "http://tempuri.org/")
public class StatusManagement extends Service {
public final static URL WSDL_LOCATION;
public final static QName SERVICE = new QName("http://tempuri.org/", "StatusManagement");
public final static QName WSHttpBindingIStatus = new QName("http://tempuri.org/", "WSHttpBinding_IStatus");
static {
URL url = null;
try {
url = new URL("c:/some_absolute_path_to_a_wsdl_file.wsdl");
} catch (MalformedURLException e) {
System.err.println("Can not initialize the default wsdl from c:/some_absolute_path_to_a_wsdl_file.wsdl");
// e.printStackTrace();
}
WSDL_LOCATION = url;
}
เส้นทางสัมบูรณ์ hardcoded แย่จริงๆ คลาสที่สร้างขึ้นจะไม่ทำงานในคอมพิวเตอร์เครื่องอื่น ๆ
แนวคิดแรกคือการวางไฟล์ WSDL (รวมถึงทุกอย่างที่นำเข้า WSDL และ XSD อื่น ๆ ) ที่ใดที่หนึ่งในไฟล์ jar และ classpath แต่เราต้องการหลีกเลี่ยงสิ่งนี้ เนื่องจากทุกสิ่งนั้นถูกสร้างขึ้นโดย CXF และ JAXB ซึ่งอยู่ใน WSDLs และ XSD เราจึงไม่เห็นจุดที่ต้องรู้ WSDL ในขณะทำงาน
แอ็ตทริบิวต์ wsdlLocation มีวัตถุประสงค์เพื่อแทนที่ตำแหน่ง WSDL (อย่างน้อยนี่คือสิ่งที่ฉันได้อ่านที่ไหนสักแห่ง) และค่าเริ่มต้นคือ "" เนื่องจากเราใช้ maven เราจึงพยายามรวม<wsdlLocation></wsdlLocation>
ไว้ในการกำหนดค่าของ CXF เพื่อพยายามบังคับให้เครื่องกำเนิดแหล่งที่มาปล่อยให้ wsdlLocation ว่าง อย่างไรก็ตามสิ่งนี้ทำให้ละเว้นแท็ก XML ได้เนื่องจากว่างเปล่า <wsdlLocation>" + "</wsdlLocation>
เราได้สับน่าอับอายน่าเกลียดจริงๆใช้
นี่เป็นการเปลี่ยนแปลงสถานที่อื่นด้วย:
@WebServiceClient(name = "StatusManagement",
wsdlLocation = "" + "",
targetNamespace = "http://tempuri.org/")
public class StatusManagement extends Service {
public final static URL WSDL_LOCATION;
public final static QName SERVICE = new QName("http://tempuri.org/", "StatusManagement");
public final static QName WSHttpBindingIStatus = new QName("http://tempuri.org/", "WSHttpBinding_IStatus");
static {
URL url = null;
try {
url = new URL("" + "");
} catch (MalformedURLException e) {
System.err.println("Can not initialize the default wsdl from " + "");
// e.printStackTrace();
}
WSDL_LOCATION = url;
}
ดังนั้นคำถามของฉันคือ:
เราต้องการตำแหน่ง WSDL จริง ๆ หรือไม่แม้ว่าจะสร้างคลาสทั้งหมดโดย CXF และ JAXB ถ้าใช่ทำไม
หากเราไม่ต้องการตำแหน่ง WSDL วิธีที่เหมาะสมและสะอาดในการทำให้ CXF ไม่สร้างและหลีกเลี่ยงมันคืออะไร?
มีผลข้างเคียงอะไรบ้างที่เราจะได้รับจากการแฮ็คนั้น เรายังไม่สามารถทดสอบสิ่งนั้นเพื่อดูว่าเกิดอะไรขึ้นดังนั้นหากใครบางคนสามารถบอกล่วงหน้าได้มันจะดี
classpath:
ใน<wsdlLocation...
บรรทัด