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.Kita gunakan
Dengan kata lain, gunakan path relatif ke classpath.
Saya percaya WSDL mungkin diperlukan saat runtime untuk validasi pesan selama marshal / unmarshal.
sumber
Bagi mereka yang menggunakan
org.jvnet.jax-ws-commons:jaxws-maven-plugin
untuk menghasilkan klien dari WSDL saat membangun:src/main/resources
wsdlLocation
denganclasspath:
wsdlLocation
dengan/
Contoh:
/src/main/resources/foo/bar.wsdl
jaxws-maven-plugin
dengan<wsdlDirectory>${basedir}/src/main/resources/foo</wsdlDirectory>
dan<wsdlLocation>/foo/bar.wsdl</wsdlLocation>
sumber
1) Dalam beberapa kasus, ya. Jika WSDL berisi hal-hal seperti Kebijakan dan yang mengarahkan perilaku runtime, maka WSDL mungkin diperlukan saat runtime. Artefak tidak dihasilkan untuk hal-hal terkait kebijakan dan semacamnya. Juga, dalam beberapa kasus RPC / Literal yang tidak jelas, tidak semua ruang nama yang diperlukan adalah output dalam kode yang dihasilkan (per spec). Dengan demikian, wsdl akan dibutuhkan untuk mereka. Kasus-kasus yang tidak jelas.
2) Saya pikir sesuatu seperti itu akan berhasil. Apa versi CXF? Itu terdengar seperti bug. Anda dapat mencoba string kosong di sana (hanya spasi). Tidak yakin apakah itu berhasil atau tidak. Yang mengatakan, dalam kode Anda, Anda dapat menggunakan konstruktor yang mengambil URL WSDL dan hanya lulus nol. Wsdl tidak akan digunakan.
3) Hanya keterbatasan di atas.
sumber
Saya bisa menghasilkan
dengan mengkonfigurasi file pom untuk memiliki null untuk wsdlurl:
sumber
Apakah mungkin Anda dapat menghindari penggunaan wsdl2java? Anda dapat langsung menggunakan API FrontFnd CXF untuk meminta layanan Web SOAP Anda. Satu-satunya tangkapan adalah bahwa Anda perlu membuat SEI dan VO Anda di sisi klien Anda. Berikut ini contoh kode.
Anda dapat melihat tutorial lengkapnya di sini http://weblog4j.com/2012/05/01/developing-soap-web-service-using-apache-cxf/
sumber
Pembaruan untuk CXF 3.1.7
Dalam kasus saya, saya meletakkan file WSDL
src/main/resources
dan menambahkan path ini ke Srouces saya di Eclipse (Klik kanan pada Project-> Build Path -> Configure Build Path ...-> Source [Tab] -> Add Folder).Ini adalah bagaimana
pom
file saya terlihat dan seperti yang terlihat tidak adawsdlLocation
opsi yang diperlukan:Dan di sini adalah Layanan yang dihasilkan. Seperti dapat dilihat, URL didapat dari ClassLoader dan bukan dari Path File Absolute
sumber
<configuration> <sourceRoot>${basedir}/src/main/java/</sourceRoot> <wsdlRoot>${basedir}/src/main/resources/</wsdlRoot> <includes> <include>*.wsdl</include> </includes> </configuration>
Saya menyertakan semua file .wsdl di jalur kelas lalu bagaimana cara menentukan Lokasi wsdl sehingga setiap file .java dapat dihasilkan sesuai dengan masing-masing jalur .wsdl? Terima kasih sebelumnya. @MazySerius, jawaban teratas tidak berfungsi untuk saya. mencoba cxf.version 2.4.1 dan 3.0.10. dan menghasilkan path absolut dengan wsdlLokasi setiap kali.
Solusi saya adalah menggunakan
wsdl2java
perintah diapache-cxf-3.0.10\bin\
with-wsdlLocation classpath:wsdl/QueryService.wsdl
.Detail:
sumber
Solusi @Martin Devillers bekerja dengan baik. Untuk kelengkapan, berikan langkah-langkah di bawah ini:
src/main/resource
Dalam file pom, tambahkan wsdlDirectory dan wsdlLocation (jangan lewatkan / di awal wsdlLocation), seperti di bawah ini. Sementara wsdlDirectory digunakan untuk menghasilkan kode dan wsdlLocation digunakan saat runtime untuk membuat proxy dinamis.
Kemudian dalam kode java Anda (dengan konstruktor no-arg):
Ini adalah bagian pembuatan kode lengkap dalam file pom, dengan api fasih dalam kode yang dihasilkan.
sumber