Perkhidmatan web di Java SE, Bahagian 2: Membuat perkhidmatan web SOAP

JAX-WS menyokong perkhidmatan Web berasaskan SOAP. Bahagian 2 dari siri empat bahagian ini pada perkhidmatan Java SE Web mendefinisikan perkhidmatan Web penukaran unit berasaskan SOAP, membangun dan kemudian mengesahkan perkhidmatan Web ini secara tempatan melalui pelayan HTTP ringan lalai (dibincangkan dalam Bahagian 1), menafsirkan dokumen WSDL perkhidmatan tersebut , dan mengakses perkhidmatan dari pelanggan sederhana.

Menentukan perkhidmatan web penukaran unit

Perkhidmatan Web penukaran unit, yang saya namakan UC, terdiri daripada empat fungsi untuk menukar antara sentimeter dan inci dan antara darjah Fahrenheit dan darjah Celsius. Walaupun contoh ini dapat diarkibkan sebagai kelas Java tunggal, saya memilih untuk mengikuti amalan terbaik dengan menjadikannya sebagai antara muka Java dan kelas Java. Penyenaraian 1 menunjukkan UCantara muka perkhidmatan Web .

Penyenaraian 1. Antaramuka Endpoint Perkhidmatan perkhidmatan 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); }

UCmenerangkan Service Endpoint Interface (SEI) , yang merupakan antara muka Java yang memperlihatkan operasi antara muka perkhidmatan Web dari segi kaedah Java yang abstrak. Pelanggan berkomunikasi dengan perkhidmatan Web berasaskan SOAP melalui SEI mereka.

UCdinyatakan sebagai SEI melalui @WebServicepenjelasan. Apabila antara muka atau kelas Java dijelaskan @WebService, semua publickaedah yang parameternya, nilai pengembaliannya, dan pengecualiannya dinyatakan mengikuti peraturan yang ditentukan dalam Bahagian 5 spesifikasi JAX-RPC 1.1 menjelaskan operasi perkhidmatan Web. Kerana hanya publickaedah boleh diisytiharkan dalam antara muka, yang publicperkataan reserved tidak perlu apabila mengisytiharkan c2f(), cm2in(), f2c(), dan in2cm(). Kaedah-kaedah ini secara tersirat public.

Setiap kaedah juga dijelaskan @WebMethod. Walaupun @WebMethodtidak penting dalam contoh ini, kehadirannya menguatkan fakta bahawa kaedah anotasi memperlihatkan operasi perkhidmatan Web.

Penyenaraian 2 menyajikan kelas perkhidmatan Web UCImpl.

Penyenaraian 2. Bean Pelaksanaan Perkhidmatan perkhidmatan 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; } }

UCImplmenggambarkan Bean Pelaksanaan Perkhidmatan (SIB) , yang menyediakan pelaksanaan SEI. Kelas ini dinyatakan sebagai SIB melalui @WebService(endpointInterface = "ca.javajeff.uc.UC")penjelasan. The endpointInterfaceelemen menghubungkan SIB ini kepada SEI, dan adalah perlu untuk mengelakkan undefined kesilapan jenis port apabila berjalan permohonan pelanggan dibentangkan kemudian.

The implements UCfasal tidak benar-benar perlu. Sekiranya klausa ini tidak ada, UCantara muka diabaikan (dan berlebihan). Walau bagaimanapun, adalah idea yang baik untuk disimpan implements UCsehingga penyusun dapat mengesahkan bahawa kaedah SEI telah dilaksanakan di SIB.

Tajuk kaedah SIB tidak dijelaskan @WebMethodkerana anotasi ini biasanya digunakan dalam konteks SEI. Namun, jika anda ingin menambahkan publicmetode (yang sesuai dengan peraturan dalam Bagian 5 dari spesifikasi JAX-RPC 1.1) ke SIB, dan jika kaedah ini tidak memperlihatkan operasi perkhidmatan Web, anda akan memberi penjelasan pada tajuk kaedah @WebMethod(exclude = true). Dengan memberikan truekepada @WebMethod's excludeelemen, anda mengelakkan bahawa kaedah dari dikaitkan dengan pembedahan.

Perkhidmatan Web ini siap diterbitkan sehingga dapat diakses dari klien. Penyenaraian 3 menghadirkan UCPublisheraplikasi yang menyelesaikan tugas ini dalam konteks pelayan HTTP ringan lalai.

Penyenaraian 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 perkhidmatan web melibatkan membuat satu panggilan kepada EndPointclass Endpoint publish(String address, Object implementor)kaedah kelas. Yang addressmengenal pasti parameter URI diberikan kepada perkhidmatan web. Saya telah memilih untuk menerbitkan perkhidmatan Web ini di host tempatan dengan menentukan localhost(setara dengan alamat IP 127.0.0.1) dan nombor port 9901(yang kemungkinan besar ada). Juga, saya memilih secara sewenang-wenangnya /UCsebagai jalan penerbitan. The implementorparameter mengenal pasti satu contoh UC's SIB.

The publish()kaedah mencipta dan menerbitkan titik akhir untuk yang dinyatakan implementorobjek di yang diberikan address, dan menggunakan implementoranotasi untuk menimbulkan Web Services Definition Language (WSDL) dan XML Schema dokumen. Ini menyebabkan infrastruktur pelayan yang diperlukan dibuat dan dikonfigurasi oleh pelaksanaan JAX-WS berdasarkan beberapa konfigurasi lalai. Selanjutnya, kaedah ini menyebabkan aplikasi berjalan selama-lamanya. (Pada mesin Windows, tekan kekunci Ctrl dan C secara serentak untuk menghentikan aplikasi.)

Membangun dan mengesahkan perkhidmatan web

Tidak sukar untuk membina perkhidmatan Web UC yang telah ditentukan sebelumnya. Pertama, anda perlu membuat struktur direktori yang sesuai yang mengandungi fail yang sesuai. Selesaikan tugas ini dengan melakukan langkah-langkah berikut:

  1. Di dalam direktori semasa, buat cadirektori. Di dalam ca, buat javajeffdirektori. Akhirnya, dalam javajeff, buat ucdirektori.
  2. Salin Penyenaraian 1 ke UC.javafail sumber dan simpan fail ini di ca/javajeff/uc.
  3. Salin Daftar 2 ke UCImpl.javafail sumber dan simpan fail ini di ca/javajeff/uc.
  4. Salin Daftar 3 ke UCPublisher.javafile sumber dan simpan fail ini di direktori semasa, yang berisi cadirektori.

Tugas seterusnya adalah menyusun fail sumber ini. Dengan mengandaikan bahawa anda belum mengubah direktori, jalankan perintah berikut untuk menyusun fail 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

Sekiranya fail 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

Semasa aplikasi berjalan, gunakan penyemak imbas Web untuk mengesahkan bahawa perkhidmatan Web ini berjalan dengan betul dan untuk mengakses dokumen WSDL-nya. Mulakan penyemak imbas Web kegemaran anda dan masukkan baris berikut di bar alamat:

//localhost:9901/UC

Gambar 1 menunjukkan halaman Web yang dihasilkan dalam penyemak imbas Google Chrome.

Gambar 1. Halaman Web UC memberikan maklumat terperinci mengenai perkhidmatan Web yang diterbitkan

Gambar 1 menunjukkan perkhidmatan dan nama port perkhidmatan akhir yang berkelayakan. (Perhatikan bahawa nama pakej telah terbalik - uc.javajeff.cabukannya ca.javajeff.uc). Pelanggan menggunakan nama-nama ini untuk mengakses perkhidmatan.

Gambar 1 juga menunjukkan alamat URI perkhidmatan Web, lokasi dokumen WSDL perkhidmatan Web (URI perkhidmatan Web yang dilampirkan oleh ?wsdlrentetan pertanyaan), dan nama yang memenuhi syarat pakej kelas pelaksanaan perkhidmatan Web.

Mentafsirkan dokumen WSDL perkhidmatan web

Lokasi dokumen WSDL perkhidmatan Web UC ditunjukkan sebagai pautan. Klik pautan ini untuk melihat dokumen WSDL, yang kandungannya disenaraikan dalam Penyenaraian 4.

Penyenaraian 4. Dokumen WSDL UC

A dokumen WSDL adalah dokumen XML dengan definitionsunsur akar, yang membuat apa-apa dokumen WSDL lebih daripada satu set definisi. Elemen ini merangkumi pelbagai xmlnsatribut untuk mengenal pasti pelbagai ruang nama standard, bersama dengan targetNameSpacedan nameatribut:

  • The targetNamespaceatribut mewujudkan ruang nama untuk semua elemen yang ditetapkan pengguna dalam dokumen WSDL yang (seperti c2funsur ditakrifkan melalui messageunsur dengan nama ini). Ruang nama ini digunakan untuk membezakan antara elemen yang ditentukan pengguna dari dokumen WSDL semasa dan elemen yang ditentukan pengguna dari dokumen WSDL yang diimport, yang dikenal pasti melalui importelemen WSDL . Dengan cara yang serupa, targetNamespaceatribut yang muncul pada schemaelemen fail berasaskan Skema XML membuat ruang nama untuk elemen jenis sederhana, elemen atribut, dan elemen jenis kompleks yang ditentukan pengguna.
  • The nameatribut mengenal pasti perkhidmatan Web dan hanya digunakan untuk mendokumentasikan perkhidmatan.

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