Bagaimana cara mengubah titik akhir url layanan web?

101

Saya membuat klien layanan web menggunakan JBoss utils (kompatibel dengan JAX-WS) menggunakan 'klien layanan web dari wsdl' Eclipse.

Jadi, satu-satunya hal yang saya sediakan adalah url ke layanan web WSDL.

Sekarang, penyedia layanan web memberi tahu saya untuk mengubah "url akses aplikasi titik akhir klien" dari layanan web.

Apa itu dan bagaimana mengubahnya?

EugeneP
sumber
Bisakah Anda membuat ulang hal itu menggunakan wizard Eclipse yang sama dengan URL baru?
Thilo
Beri tahu penyedia layanan web bahwa Anda memerlukan url baru ke wsdl, lalu gunakan dengan wizard Eclipse untuk membuat ulang klien.
systempuntoout
@Thilo @systemputoout GUYS, masalahnya mereka punya URL WSDL YANG SAMA !! Saya tidak yakin, tetapi menurut saya di Axis Anda dapat memberikan URL saat menjalankan layanan web. Di JAX-WS Anda tidak dapat mengubah "titik akhir klien selama runtime". Ada ide, guys?
EugeneP
1
@ Pascal Thivent, @systempuntoout Kutip: "URL atau titik akhir untuk akses aplikasi klien"
EugeneP
1
Nah, pemahaman saya tentang kalimat ini adalah "klien mengakses titik akhir layanan; lokasi titik akhir telah berubah". Dan ini masuk akal.
Pascal Thivent

Jawaban:

174

IMO, penyedia memberi tahu Anda untuk mengubah titik akhir layanan (yaitu, tempat menjangkau layanan web), bukan titik akhir klien (saya tidak mengerti apa yang bisa terjadi). Untuk mengubah titik akhir layanan, pada dasarnya Anda memiliki dua opsi.

Gunakan Penyedia Binding untuk menyetel URL titik akhir

Opsi pertama adalah mengubah nilai BindingProvider.ENDPOINT_ADDRESS_PROPERTYproperti BindingProvider(setiap javax.xml.ws.BindingProviderantarmuka mengimplementasikan proxy ):

...
EchoService service = new EchoService();
Echo port = service.getEchoPort();

/* Set NEW Endpoint Location */
String endpointURL = "http://NEW_ENDPOINT_URL";
BindingProvider bp = (BindingProvider)port;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);

System.out.println("Server said: " + echo.echo(args[0]));
...

Kekurangannya adalah ini hanya berfungsi jika WSDL asli masih dapat diakses. Tidak direkomendasikan.

Gunakan WSDL untuk mendapatkan URL titik akhir

Opsi kedua adalah mendapatkan URL titik akhir dari WSDL.

...
URL newEndpoint = new URL("NEW_ENDPOINT_URL");
QName qname = new QName("http://ws.mycompany.tld","EchoService"); 

EchoService service = new EchoService(newEndpoint, qname);
Echo port = service.getEchoPort();

System.out.println("Server said: " + echo.echo(args[0]));
...
Pascal Thivent
sumber
7
Saya pikir ada kesalahan di blok kode kedua, bukankah seharusnya itu URL newEndpoint = URL baru ("WSDL_URL"); di baris pertama ??
Jaime Hablutzel
3
di sini adalah link ke tutorial tugdualgrall.blogspot.com/2009/02/...
Shareef
12
Perlu diperhatikan bahwa wsimportalat modern tidak lagi menghasilkan kode dengan get[Service]Portmetode. Sebaliknya, panggil get[Service]dan transmisikan objek yang dihasilkan ke a BindingProvideruntuk menyetel properti semacam ini.
Christopher Schultz
Terima kasih @ChristopherSchultz atas tip wsimport! Def itu. bekerja untuk kami
Cuga
1
Sejauh yang saya mengerti dari kode rintisan yang dihasilkan cxf, opsi kedua di atas mengubah url wsdl, bukan url layanan. Apakah saya melewatkan sesuatu?
cacert
16

Untuk menambahkan beberapa klarifikasi di sini, saat Anda membuat layanan, kelas layanan menggunakan 'wsdlLocation' default, yang disisipkan ke dalamnya saat kelas dibuat dari wsdl. Jadi jika Anda memiliki kelas layanan yang disebut SomeService, dan Anda membuat instance seperti ini:

SomeService someService = new SomeService();

Jika Anda melihat ke dalam SomeService, Anda akan melihat bahwa konstruktornya terlihat seperti ini:

public SomeService() {
        super(__getWsdlLocation(), SOMESERVICE_QNAME);
}

Jadi jika Anda ingin mengarahkan ke URL lain, Anda cukup menggunakan konstruktor yang mengambil argumen URL (ada 6 konstruktor untuk menyetel qname dan fitur juga). Misalnya, jika Anda telah menyiapkan monitor TCP / IP lokal yang mendengarkan pada port 9999, dan Anda ingin mengalihkan ke URL itu:

URL newWsdlLocation = new URL("http://theServerName:9999/somePath");
SomeService someService = new SomeService(newWsdlLocation);

dan itu akan memanggil konstruktor ini di dalam layanan:

public SomeService(URL wsdlLocation) {
    super(wsdlLocation, SOMESERVICE_QNAME);
}
MattC
sumber
2
Belum tentu. Saya memiliki layanan yang dihasilkan dengan wsdl2java Apache CXF, dan bahkan ketika kami meneruskan lokasi wsdl baru ke konstruktor, portnya masih mencoba untuk mengikat ke lokasi yang ditetapkan pada waktu kompilasi / pembuatan (tidak meninggalkan pilihan apa pun selain mengetik port ke BindingProvider dan atur alamat baru dalam peta konteks permintaannya.)
luis.espinal
1
@Luis - Sulit untuk mengetahui dengan tepat apa yang Anda lihat, tetapi jika Anda men-debug, Anda akan melihat panggilan ke kelas Penyedia javax, dan kemudian melihatnya mencoba membuat titik akhir dengan lokasi wsdl baru Anda (dengan asumsi Anda menggunakan JAX-WS 2.0 +). Kemudian di dalam layanan Anda, panggilan getPort harus memanggil super.getPort, yang menggunakan port baru Anda yang disetel dalam objek serviceDelegate. Begitulah cara kerjanya dengan javax.xml.ws.Service di JAX-WS 2.0. Saya akan menempatkan breakpoint pada panggilan super dan menyelidiki dari sana.
MattC
0

Saya tidak akan bertindak sejauh @Femi untuk mengubah properti alamat yang ada. Anda dapat menambahkan layanan baru ke bagian definisi dengan mudah.

<wsdl:service name="serviceMethodName_2">
  <wsdl:port binding="tns:serviceMethodNameSoapBinding" name="serviceMethodName">
    <soap:address location="http://new_end_point_adress"/>
  </wsdl:port>
</wsdl:service>

Ini tidak memerlukan kompilasi ulang WSDL ke Java dan membuat pembaruan tidak lebih sulit daripada jika Anda menggunakan opsi BindingProvider (yang tidak berfungsi untuk saya btw).

TastyWheat
sumber
-6

Untuk mengubah properti alamat akhir, edit file wsdl Anda

<wsdl:definitions.......
  <wsdl:service name="serviceMethodName">
    <wsdl:port binding="tns:serviceMethodNameSoapBinding" name="serviceMethodName">
      <soap:address location="http://service_end_point_adress"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>
Femi
sumber
11
Dalam banyak kasus, WSDL dikenakan kepada Anda dan Anda tidak boleh mengubahnya. Lebih penting lagi, dari satu lingkungan ke yang lain (uji vs langsung), url titik akhir kemungkinan akan berubah .. dan tidak ada yang ingin mengubah wsdl dan mengkompilasi ulang dalam kasus ini.
Myobis