Layanan web di Java SE, Bagian 2: Membuat layanan web SOAP

JAX-WS mendukung layanan Web berbasis SOAP. Bagian 2 dari seri empat bagian ini pada layanan Web Java SE mendefinisikan layanan Web konversi unit berbasis SOAP, membangun dan kemudian memverifikasi layanan Web ini secara lokal melalui server HTTP ringan default (dibahas di Bagian 1), menafsirkan dokumen WSDL layanan , dan mengakses layanan dari klien sederhana.

Mendefinisikan layanan web konversi unit

Layanan web konversi unit, yang saya beri nama UC, terdiri dari empat fungsi untuk mengubah antara sentimeter dan inci dan antara derajat Fahrenheit dan derajat Celcius. Meskipun contoh ini dapat dirancang sebagai kelas Java tunggal, saya telah memilih untuk mengikuti praktik terbaik dengan merancangnya sebagai antarmuka Java dan kelas Java. Kode 1 menampilkan UCantarmuka layanan Web .

Daftar 1. Antarmuka Titik Akhir Layanan layanan Web UC

package ca.javajeff.uc; import javax.jws.WebMethod; import javax.jws.WebService; @WebService public interface UC { @WebMethod double c2f(double degrees); @WebMethod double cm2in(double cm); @WebMethod double f2c(double degrees); @WebMethod double in2cm(double in); }

UCmenjelaskan Service Endpoint Interface (SEI) , yang merupakan antarmuka Java yang mengekspos operasi antarmuka layanan Web dalam istilah metode Java abstrak. Klien berkomunikasi dengan layanan Web berbasis SOAP melalui SEI mereka.

UCdinyatakan sebagai SEI melalui @WebServiceanotasi. Ketika antarmuka atau kelas Java dianotasi @WebService, semua publicmetode yang parameternya, nilai kembaliannya, dan pengecualiannya mengikuti aturan yang ditentukan dalam Bagian 5 dari spesifikasi JAX-RPC 1.1 menjelaskan operasi layanan Web. Karena hanya publicmetode dapat dinyatakan dalam antarmuka, publickata reserved tidak diperlukan ketika mendeklarasikan c2f(), cm2in(), f2c(), dan in2cm(). Metode-metode ini secara implisit public.

Setiap metode juga diberi anotasi @WebMethod. Meskipun @WebMethodtidak penting dalam contoh ini, kehadirannya memperkuat fakta bahwa metode beranotasi mengekspos operasi layanan Web.

Kode 2 menyajikan kelas layanan Web UCImpl.

Daftar 2. Bean Implementasi Layanan layanan Web UC

package ca.javajeff.uc; import javax.jws.WebService; @WebService(endpointInterface = "ca.javajeff.uc.UC") public class UCImpl implements UC { @Override public double c2f(double degrees) { return degrees * 9.0 / 5.0 + 32; } @Override public double cm2in(double cm) { return cm / 2.54; } @Override public double f2c(double degrees) { return (degrees - 32) * 5.0 / 9.0; } @Override public double in2cm(double in) { return in * 2.54; } }

UCImplmenjelaskan Service Implementation Bean (SIB) , yang menyediakan implementasi SEI. Kelas ini dinyatakan sebagai SIB melalui @WebService(endpointInterface = "ca.javajeff.uc.UC")anotasi. The endpointInterfaceelemen menghubungkan SIB ini untuk nya SEI, dan diperlukan untuk menghindari kesalahan jenis port terdefinisi ketika menjalankan aplikasi klien disajikan kemudian.

The implements UCklausul tidak mutlak diperlukan. Jika klausa ini tidak ada, UCantarmuka akan diabaikan (dan berlebihan). Namun, sebaiknya simpan implements UCagar kompilator dapat memverifikasi bahwa metode SEI telah diterapkan di SIB.

Header metode SIB tidak diberi anotasi @WebMethodkarena anotasi ini biasanya digunakan dalam konteks SEI. Namun, jika Anda akan menambahkan publicmetode (yang sesuai dengan aturan di Bagian 5 spesifikasi JAX-RPC 1.1) ke SIB, dan jika metode ini tidak mengekspos operasi layanan Web, Anda akan memberi keterangan pada header metode @WebMethod(exclude = true). Dengan menetapkan trueke @WebMethod's excludeelemen, Anda mencegah metode tersebut dikaitkan dengan operasi.

Layanan Web ini siap dipublikasikan sehingga dapat diakses dari klien. Kode 3 menyajikan UCPublisheraplikasi yang menyelesaikan tugas ini dalam konteks server HTTP ringan default.

Daftar 3. Penerbitan UC

import javax.xml.ws.Endpoint; import ca.javajeff.uc.UCImpl; public class UCPublisher { public static void main(String[] args) { Endpoint.publish("//localhost:9901/UC", new UCImpl()); } }

Penerbitan layanan Web melibatkan membuat satu panggilan ke metode EndPointkelas Endpoint publish(String address, Object implementor)kelas. The addressparameter mengidentifikasi URI ditugaskan ke layanan Web. Saya telah memilih untuk mempublikasikan layanan Web ini di host lokal dengan menentukan localhost(setara dengan alamat IP 127.0.0.1) dan nomor port 9901(yang kemungkinan besar tersedia). Juga, saya telah memilih secara sewenang-wenang /UCsebagai jalur publikasi. The implementorparameter mengidentifikasi sebuah contoh dari UC's SIB.

The publish()Metode menciptakan dan menerbitkan endpoint untuk ditentukan implementorobjek di diberikan address, dan menggunakan implementor'penjelasan untuk menciptakan Web Services Definition Language (WSDL) dan XML Schema dokumen. Ini menyebabkan infrastruktur server yang diperlukan dibuat dan dikonfigurasi oleh implementasi JAX-WS berdasarkan beberapa konfigurasi default. Selanjutnya, metode ini menyebabkan aplikasi berjalan tanpa batas. (Pada mesin Windows, tekan Ctrl dan C kunci secara bersamaan untuk menghentikan aplikasi.)

Membangun dan memverifikasi layanan web

Tidak sulit untuk membangun layanan UC Web yang telah didefinisikan sebelumnya. Pertama, Anda perlu membuat struktur direktori yang sesuai berisi file yang sesuai. Selesaikan tugas ini dengan melakukan langkah-langkah berikut:

  1. Di dalam direktori saat ini, buat cadirektori. Di dalam ca, buat javajeffdirektori. Terakhir, di dalam javajeff, buat ucdirektori.
  2. Salin Daftar 1 ke UC.javafile sumber dan simpan file ini di ca/javajeff/uc.
  3. Salin Daftar 2 ke UCImpl.javafile sumber dan simpan file ini di ca/javajeff/uc.
  4. Salin Daftar 3 ke UCPublisher.javafile sumber dan simpan file ini di direktori saat ini, yang berisi cadirektori.

Tugas selanjutnya adalah mengkompilasi file sumber ini. Dengan asumsi Anda belum mengubah direktori, jalankan perintah berikut untuk mengompilasi file sumber ini di Java SE 9 (hilangkan --add-modules java.xml.wsdi Java SE 6, 7, atau 8):

javac --add-modules java.xml.ws UCPublisher.java

Jika file sumber ini berhasil dikompilasi, jalankan perintah berikut untuk menjalankan aplikasi ini di Java 9 (hilangkan --add-modules java.xml.wsdi Java SE 6, 7, atau 8):

java --add-modules java.xml.ws UCPublisher

Saat aplikasi berjalan, gunakan browser Web untuk memverifikasi bahwa layanan Web ini berjalan dengan benar dan mengakses dokumen WSDL-nya. Mulai browser web favorit Anda dan masukkan baris berikut di bilah alamat:

//localhost:9901/UC

Gambar 1 menunjukkan halaman Web yang dihasilkan di browser Web Google Chrome.

Gambar 1. Halaman Web UC memberikan informasi rinci tentang layanan Web yang dipublikasikan

Gambar 1 menyajikan layanan yang memenuhi syarat dan nama port titik akhir layanan Web. (Perhatikan bahwa nama paket telah dibalik - uc.javajeff.cabukan ca.javajeff.uc). Klien menggunakan nama ini untuk mengakses layanan.

Gambar 1 juga menyajikan alamat URI layanan Web, lokasi dokumen WSDL layanan Web (URI layanan Web yang diakhiri dengan ?wsdlstring kueri), dan nama paket yang memenuhi syarat dari kelas implementasi layanan Web.

Menafsirkan dokumen WSDL layanan web

Lokasi dokumen WSDL layanan Web UC disajikan sebagai tautan. Klik link ini untuk melihat dokumen WSDL, yang isinya disajikan pada Listing 4.

Daftar 4. Dokumen WSDL UC

Sebuah dokumen WSDL adalah dokumen XML dengan definitionselemen root, yang membuat tidak ada dokumen WSDL lebih dari satu set definisi. Elemen ini mencakup berbagai xmlnsatribut untuk mengidentifikasi berbagai ruang nama standar, bersama dengan atribut targetNameSpacedan name:

  • The targetNamespaceatribut menciptakan namespace untuk semua elemen yang ditetapkan pengguna dalam dokumen WSDL (seperti c2felemen didefinisikan melalui messageelemen dengan nama ini). Namespace ini digunakan untuk membedakan antara elemen yang ditentukan pengguna dari dokumen WSDL saat ini dan elemen yang ditentukan pengguna dari dokumen WSDL yang diimpor, yang diidentifikasi melalui importelemen WSDL . Dengan cara yang sama, targetNamespaceatribut yang muncul pada schemaelemen file berbasis Skema XML membuat namespace untuk elemen tipe sederhana, elemen atribut, dan elemen tipe kompleks yang ditentukan pengguna.
  • The nameatribut mengidentifikasi layanan Web dan hanya digunakan untuk mendokumentasikan layanan.

Bersarang dalam definitionsadalah types, message, portType, binding, dan serviceunsur-unsur: