Khi tôi tạo một ứng dụng khách dịch vụ web bằng wsdl2java từ CXF (tạo ra một cái gì đó tương tự như wsimport), thông qua maven, các dịch vụ của tôi bắt đầu với các mã như thế này:
@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;
}
Con đường tuyệt đối mã hóa thực sự hút. Lớp được tạo sẽ không hoạt động trong bất kỳ máy tính nào khác ngoài máy tính của tôi.
Ý tưởng đầu tiên là đặt tệp WSDL (cộng với mọi thứ mà nó nhập, các WSDL và XSD khác) ở đâu đó trong tệp jar và phân loại tệp. Nhưng chúng tôi muốn tránh điều này. Vì tất cả những thứ đó được tạo ra bởi CXF và JAXB dựa trên WSDL và XSD, chúng tôi thấy không cần phải biết WSDL khi chạy.
Thuộc tính wsdlLocation nhằm ghi đè vị trí WSDL (ít nhất đây là những gì tôi đã đọc ở đâu đó) và giá trị mặc định của nó là "". Vì chúng tôi đang sử dụng maven, chúng tôi đã cố gắng đưa <wsdlLocation></wsdlLocation>
vào cấu hình của CXF để cố gắng buộc trình tạo nguồn để trống wsdlLocation. Tuy nhiên, điều này chỉ đơn giản là làm cho nó bỏ qua thẻ XML vì nó trống. Chúng tôi đã thực hiện một hack đáng xấu hổ thực sự xấu xí, sử dụng <wsdlLocation>" + "</wsdlLocation>
.
Điều này cũng thay đổi những nơi khác:
@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;
}
Vì vậy, câu hỏi của tôi là:
Chúng ta có thực sự cần một vị trí WSDL ngay cả khi tất cả các lớp được tạo bởi CXF và JAXB không? Nếu đúng thì tại sao?
Nếu chúng ta không thực sự cần vị trí WSDL, cách phù hợp và rõ ràng để làm cho CXF không tạo ra nó và tránh hoàn toàn nó là gì?
Những tác dụng phụ xấu nào chúng ta có thể nhận được với bản hack đó? Chúng tôi vẫn không thể kiểm tra xem điều gì sẽ xảy ra, vì vậy nếu ai đó có thể nói trước, điều đó thật tuyệt.
classpath:
trong<wsdlLocation...
dòng.