Ketika saya membuat klien layanan web menggunakan wsdl2java dari CXF (yang menghasilkan sesuatu yang mirip dengan wsimport), melalui maven, layanan saya dimulai dengan kode seperti ini:
@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;
}
Jalan absolut hardcoded benar-benar menyebalkan. Kelas yang dihasilkan tidak akan berfungsi di komputer lain selain komputer saya.
Gagasan pertama adalah meletakkan file WSDL (plus semua yang diimpornya, WSDL dan XSD lainnya) di suatu tempat di dalam file jar dan mengelompokkannya. Tapi kami ingin menghindari ini. Karena semua hal itu dihasilkan oleh CXF dan JAXB yang berbasis di WSDLs dan XSDs, kami melihat tidak ada gunanya mengetahui WSDL saat runtime.
Atribut wsdlLocation dimaksudkan untuk mengesampingkan lokasi WSDL (setidaknya ini yang saya baca di suatu tempat), dan nilai defaultnya adalah "". Karena kami menggunakan maven, kami mencoba memasukkan ke <wsdlLocation></wsdlLocation>
dalam konfigurasi CXF untuk mencoba memaksa generator sumber untuk membiarkan wsdlLocation kosong. Namun, ini membuatnya mengabaikan tag XML karena kosong. Kami melakukan peretasan yang sangat memalukan, menggunakan <wsdlLocation>" + "</wsdlLocation>
.
Ini mengubah tempat lain juga:
@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;
}
Jadi, pertanyaan saya adalah:
Apakah kita benar-benar membutuhkan lokasi WSDL bahkan jika semua kelas dihasilkan oleh CXF dan JAXB? Jika ya, mengapa?
Jika kita tidak benar-benar membutuhkan lokasi WSDL, apa cara yang tepat dan bersih untuk membuat CXF tidak menghasilkannya dan menghindarinya sepenuhnya?
Apa efek samping buruk yang bisa kita peroleh dengan peretasan itu? Kami masih belum bisa mengujinya untuk melihat apa yang terjadi, jadi jika seseorang bisa mengatakan di muka, itu akan baik.
classpath:
di<wsdlLocation...
baris.